Browse code

* Fixes for gcc and clang (while they can compile the code, the DLLs made aren't functional, but oh well).

* [2SF] Used more up-to-date asmjit, despite the ugly looking code.

Naram Qashat authored on 2014/09/17 19:51:45
Showing 1 changed files
... ...
@@ -17,7 +17,7 @@
17 17
 
18 18
 static int clockTicks;
19 19
 
20
-static INSN_REGPARM void armUnknownInsn(uint32_t opcode)
20
+static INSN_REGPARM void armUnknownInsn(uint32_t)
21 21
 {
22 22
 	CPUUndefinedException();
23 23
 }
Browse code

Updating the VBA-M code to revision 1231.

Naram Qashat authored on 2014/09/08 12:20:28
Showing 1 changed files
... ...
@@ -52,578 +52,6 @@ template<typename T> static inline T POS(const T &i) { return ~i >> 31; }
52 52
 //    RRX_OFFSET: Used to rotate (RRX) the `offset' parameter for LDR and
53 53
 //                STR instructions.
54 54
 
55
-#ifndef C_CORE
56
-# if 0  // definitions have changed
57
-//#ifdef __POWERPC__
58
-#  define OP_SUBS \
59
-{ \
60
-	register int Flags; \
61
-	register int Result; \
62
-	asm volatile("subco. %0, %2, %3\n" \
63
-		"mcrxr cr1\n" \
64
-		"mfcr %1\n" \
65
-		: "=r" (Result), \
66
-		"=r" (Flags) \
67
-		: "r" (reg[base].I), \
68
-		"r" (value) \
69
-		); \
70
-	reg[dest].I = Result; \
71
-	Z_FLAG = (Flags >> 29) & 1; \
72
-	N_FLAG = (Flags >> 31) & 1; \
73
-	C_FLAG = (Flags >> 25) & 1; \
74
-	V_FLAG = (Flags >> 26) & 1; \
75
-}
76
-#  define OP_RSBS \
77
-{ \
78
-	register int Flags; \
79
-	register int Result; \
80
-	asm volatile("subfco. %0, %2, %3\n" \
81
-		"mcrxr cr1\n" \
82
-		"mfcr %1\n" \
83
-		: "=r" (Result), \
84
-		"=r" (Flags) \
85
-		: "r" (reg[base].I), \
86
-		"r" (value) \
87
-		); \
88
-	reg[dest].I = Result; \
89
-	Z_FLAG = (Flags >> 29) & 1; \
90
-	N_FLAG = (Flags >> 31) & 1; \
91
-	C_FLAG = (Flags >> 25) & 1; \
92
-	V_FLAG = (Flags >> 26) & 1; \
93
-}
94
-#  define OP_ADDS \
95
-{ \
96
-	register int Flags; \
97
-	register int Result; \
98
-	asm volatile("addco. %0, %2, %3\n" \
99
-		"mcrxr cr1\n" \
100
-		"mfcr %1\n" \
101
-		: "=r" (Result), \
102
-		"=r" (Flags) \
103
-		: "r" (reg[base].I), \
104
-		"r" (value) \
105
-		); \
106
-	reg[dest].I = Result; \
107
-	Z_FLAG = (Flags >> 29) & 1; \
108
-	N_FLAG = (Flags >> 31) & 1; \
109
-	C_FLAG = (Flags >> 25) & 1; \
110
-	V_FLAG = (Flags >> 26) & 1; \
111
-}
112
-#  define OP_ADCS \
113
-{ \
114
-	register int Flags; \
115
-	register int Result; \
116
-	asm volatile("mtspr xer, %4\n" \
117
-		"addeo. %0, %2, %3\n" \
118
-		"mcrxr cr1\n" \
119
-		"mfcr %1\n" \
120
-		: "=r" (Result), \
121
-		"=r" (Flags) \
122
-		: "r" (reg[base].I), \
123
-		"r" (value), \
124
-		"r" (C_FLAG << 29) \
125
-		); \
126
-	reg[dest].I = Result; \
127
-	Z_FLAG = (Flags >> 29) & 1; \
128
-	N_FLAG = (Flags >> 31) & 1; \
129
-	C_FLAG = (Flags >> 25) & 1; \
130
-	V_FLAG = (Flags >> 26) & 1; \
131
-}
132
-#  define OP_SBCS \
133
-{ \
134
-	register int Flags; \
135
-	register int Result; \
136
-	asm volatile("mtspr xer, %4\n" \
137
-		"subfeo. %0, %3, %2\n" \
138
-		"mcrxr cr1\n" \
139
-		"mfcr %1\n" \
140
-		: "=r" (Result), \
141
-		"=r" (Flags) \
142
-		: "r" (reg[base].I), \
143
-		"r" (value), \
144
-		"r" (C_FLAG << 29) \
145
-		); \
146
-	reg[dest].I = Result; \
147
-	Z_FLAG = (Flags >> 29) & 1; \
148
-	N_FLAG = (Flags >> 31) & 1; \
149
-	C_FLAG = (Flags >> 25) & 1; \
150
-	V_FLAG = (Flags >> 26) & 1; \
151
-}
152
-#  define OP_RSCS \
153
-{ \
154
-	register int Flags; \
155
-	register int Result; \
156
-	asm volatile("mtspr xer, %4\n"\
157
-		"subfeo. %0, %2, %3\n" \
158
-		"mcrxr cr1\n" \
159
-		"mfcr %1\n" \
160
-		: "=r" (Result), \
161
-		"=r" (Flags) \
162
-		: "r" (reg[base].I), \
163
-		"r" (value), \
164
-		"r" (C_FLAG << 29) \
165
-		); \
166
-	reg[dest].I = Result; \
167
-	Z_FLAG = (Flags >> 29) & 1; \
168
-	N_FLAG = (Flags >> 31) & 1; \
169
-	C_FLAG = (Flags >> 25) & 1; \
170
-	V_FLAG = (Flags >> 26) & 1; \
171
-}
172
-#  define OP_CMP \
173
-{ \
174
-	register int Flags; \
175
-	register int Result; \
176
-	asm volatile("subco. %0, %2, %3\n" \
177
-		"mcrxr cr1\n" \
178
-		"mfcr %1\n" \
179
-		: "=r" (Result), \
180
-		"=r" (Flags) \
181
-		: "r" (reg[base].I), \
182
-		"r" (value) \
183
-		); \
184
-	Z_FLAG = (Flags >> 29) & 1; \
185
-	N_FLAG = (Flags >> 31) & 1; \
186
-	C_FLAG = (Flags >> 25) & 1; \
187
-	V_FLAG = (Flags >> 26) & 1; \
188
-}
189
-#  define OP_CMN \
190
-{ \
191
-	register int Flags; \
192
-	register int Result; \
193
-	asm volatile("addco. %0, %2, %3\n" \
194
-		"mcrxr cr1\n" \
195
-		"mfcr %1\n" \
196
-		: "=r" (Result), \
197
-		"=r" (Flags) \
198
-		: "r" (reg[base].I), \
199
-		"r" (value) \
200
-		); \
201
-	Z_FLAG = (Flags >> 29) & 1; \
202
-	N_FLAG = (Flags >> 31) & 1; \
203
-	C_FLAG = (Flags >> 25) & 1; \
204
-	V_FLAG = (Flags >> 26) & 1; \
205
-}
206
-# else  // !__POWERPC__
207
-// Macros to emit instructions in the format used by the particular compiler.
208
-// We use GNU assembler syntax: "op src, dest" rather than "op dest, src"
209
-
210
-#  ifdef __GNUC__
211
-#   define ALU_HEADER asm("mov %%ecx, %%edi; "
212
-#   define ALU_TRAILER : "=D" (opcode) : "c" (opcode) : "eax", "ebx", "edx", "esi")
213
-#   define EMIT0(op) #op "; "
214
-#   define EMIT1(op, arg) #op " " arg "; "
215
-#   define EMIT2(op, src, dest) #op " " src ", " dest "; "
216
-#   define KONST(val) "$" #val
217
-#   define ASMVAR(cvar) ASMVAR2(__USER_LABEL_PREFIX__, cvar)
218
-#   define ASMVAR2(prefix, cvar) STRING(prefix) cvar
219
-#   define STRING(x) #x
220
-#   define VAR(var) ASMVAR(#var)
221
-#   define VARL(var) ASMVAR(#var)
222
-#   define REGREF1(index) ASMVAR("reg(" index ")")
223
-#   define REGREF2(index, scale) ASMVAR("reg(," index "," #scale ")")
224
-#   define LABEL(n) #n ": "
225
-#   define LABELREF(n, dir) #n#dir
226
-#   define al "%%al"
227
-#   define ah "%%ah"
228
-#   define eax "%%eax"
229
-#   define bl "%%bl"
230
-#   define bh "%%bh"
231
-#   define ebx "%%ebx"
232
-#   define cl "%%cl"
233
-#   define ch "%%ch"
234
-#   define ecx "%%ecx"
235
-#   define dl "%%dl"
236
-#   define dh "%%dh"
237
-#   define edx "%%edx"
238
-#   define esp "%%esp"
239
-#   define ebp "%%ebp"
240
-#   define esi "%%esi"
241
-#   define edi "%%edi"
242
-#   define movzx movzb
243
-#  else
244
-#   define ALU_HEADER __asm { __asm mov ecx, opcode
245
-#   define ALU_TRAILER }
246
-#   define EMIT0(op) __asm op
247
-#   define EMIT1(op, arg) __asm op arg
248
-#   define EMIT2(op, src, dest) __asm op dest, src
249
-#   define KONST(val) val
250
-#   define VAR(var) var
251
-#   define VARL(var) dword ptr var
252
-#   define REGREF1(index) reg[index]
253
-#   define REGREF2(index, scale) reg[index * scale]
254
-#   define LABEL(n) __asm l##n:
255
-#   define LABELREF(n, dir) l##n
256
-#  endif
257
-
258
-//X//#ifndef _MSC_VER
259
-// ALU op register usage:
260
-//    EAX -> 2nd operand value, result (RSB/RSC)
261
-//    EBX -> C_OUT (carry flag from shift/rotate)
262
-//    ECX -> opcode (input), shift/rotate count
263
-//    EDX -> Rn (base) value, result (all except RSB/RSC)
264
-//    ESI -> Rd (destination) index * 4
265
-
266
-// Helper macros for loading value / shift count
267
-#  define VALUE_LOAD_IMM \
268
-	EMIT2(and, KONST(0x0F), eax) \
269
-	EMIT2(mov, REGREF2(eax, 4), eax) \
270
-	EMIT2(shr, KONST(7), ecx) \
271
-	EMIT2(and, KONST(0x1F), ecx)
272
-#  define VALUE_LOAD_REG \
273
-	EMIT2(and, KONST(0x0F), eax) \
274
-	EMIT2(cmp, KONST(0x0F), eax) \
275
-	EMIT2(mov, REGREF2(eax, 4), eax) \
276
-	EMIT1(jne, LABELREF(3, f)) \
277
-	EMIT2(add, KONST(4), eax) \
278
-	LABEL(3) \
279
-	EMIT2(movzx, ch, ecx) \
280
-	EMIT2(and, KONST(0x0F), ecx) \
281
-	EMIT2(mov, REGREF2(ecx, 4), ecx)
282
-
283
-// Helper macros for setting flags
284
-#  define SETCOND_LOGICAL \
285
-	EMIT1(sets, VAR(N_FLAG)) \
286
-	EMIT1(setz, VAR(Z_FLAG)) \
287
-	EMIT2(mov, bl, VAR(C_FLAG))
288
-#  define SETCOND_ADD \
289
-	EMIT1(sets, VAR(N_FLAG)) \
290
-	EMIT1(setz, VAR(Z_FLAG)) \
291
-	EMIT1(seto, VAR(V_FLAG)) \
292
-	EMIT1(setc, VAR(C_FLAG))
293
-#  define SETCOND_SUB \
294
-	EMIT1(sets, VAR(N_FLAG)) \
295
-	EMIT1(setz, VAR(Z_FLAG)) \
296
-	EMIT1(seto, VAR(V_FLAG)) \
297
-	EMIT1(setnc, VAR(C_FLAG))
298
-
299
-// ALU initialization
300
-#  define ALU_INIT(LOAD_C_FLAG) \
301
-	ALU_HEADER \
302
-	LOAD_C_FLAG \
303
-	EMIT2(mov, ecx, edx) \
304
-	EMIT2(shr, KONST(14), edx) \
305
-	EMIT2(mov, ecx, eax) \
306
-	EMIT2(mov, ecx, esi) \
307
-	EMIT2(shr, KONST(10), esi) \
308
-	EMIT2(and, KONST(0x3C), edx) \
309
-	EMIT2(mov, REGREF1(edx), edx) \
310
-	EMIT2(and, KONST(0x3C), esi)
311
-
312
-#  define LOAD_C_FLAG_YES EMIT2(mov, VAR(C_FLAG), bl)
313
-#  define LOAD_C_FLAG_NO /*nothing*/
314
-#  define ALU_INIT_C ALU_INIT(LOAD_C_FLAG_YES)
315
-#  define ALU_INIT_NC ALU_INIT(LOAD_C_FLAG_NO)
316
-
317
-// Macros to load the value operand for an ALU op; these all set N/Z
318
-// according to the value
319
-
320
-// OP Rd,Rb,Rm LSL #
321
-#  define VALUE_LSL_IMM_C \
322
-	VALUE_LOAD_IMM \
323
-	EMIT1(jnz, LABELREF(1, f)) \
324
-	EMIT1(jmp, LABELREF(0, f)) \
325
-	LABEL(1) \
326
-	EMIT2(shl, cl, eax) \
327
-	EMIT1(setc, bl) \
328
-	LABEL(0)
329
-#  define VALUE_LSL_IMM_NC \
330
-	VALUE_LOAD_IMM \
331
-	EMIT2(shl, cl, eax)
332
-
333
-// OP Rd,Rb,Rm LSL Rs
334
-#  define VALUE_LSL_REG_C \
335
-	VALUE_LOAD_REG \
336
-	EMIT2(test, cl, cl) \
337
-	EMIT1(jz, LABELREF(0, f)) \
338
-	EMIT2(cmp, KONST(0x20), cl) \
339
-	EMIT1(je, LABELREF(1, f)) \
340
-	EMIT1(ja, LABELREF(2, f)) \
341
-	EMIT2(shl, cl, eax) \
342
-	EMIT1(setc, bl) \
343
-	EMIT1(jmp, LABELREF(0, f)) \
344
-	LABEL(1) \
345
-	EMIT2(test, KONST(1), al) \
346
-	EMIT1(setnz, bl) \
347
-	EMIT2(xor, eax, eax) \
348
-	EMIT1(jmp, LABELREF(0, f)) \
349
-	LABEL(2) \
350
-	EMIT2(xor, ebx, ebx) \
351
-	EMIT2(xor, eax, eax) \
352
-	LABEL(0)
353
-#  define VALUE_LSL_REG_NC \
354
-	VALUE_LOAD_REG \
355
-	EMIT2(cmp, KONST(0x20), cl) \
356
-	EMIT1(jae, LABELREF(1, f)) \
357
-	EMIT2(shl, cl, eax) \
358
-	EMIT1(jmp, LABELREF(0, f)) \
359
-	LABEL(1) \
360
-	EMIT2(xor, eax, eax) \
361
-	LABEL(0)
362
-
363
-// OP Rd,Rb,Rm LSR #
364
-#  define VALUE_LSR_IMM_C \
365
-	VALUE_LOAD_IMM \
366
-	EMIT1(jz, LABELREF(1, f)) \
367
-	EMIT2(shr, cl, eax) \
368
-	EMIT1(setc, bl) \
369
-	EMIT1(jmp, LABELREF(0, f)) \
370
-	LABEL(1) \
371
-	EMIT2(test, eax, eax) \
372
-	EMIT1(sets, bl) \
373
-	EMIT2(xor, eax, eax) \
374
-	LABEL(0)
375
-#  define VALUE_LSR_IMM_NC \
376
-	VALUE_LOAD_IMM \
377
-	EMIT1(jz, LABELREF(1, f)) \
378
-	EMIT2(shr, cl, eax) \
379
-	EMIT1(jmp, LABELREF(0, f)) \
380
-	LABEL(1) \
381
-	EMIT2(xor, eax, eax) \
382
-	LABEL(0)
383
-
384
-// OP Rd,Rb,Rm LSR Rs
385
-#  define VALUE_LSR_REG_C \
386
-	VALUE_LOAD_REG \
387
-	EMIT2(test, cl, cl) \
388
-	EMIT1(jz, LABELREF(0, f)) \
389
-	EMIT2(cmp, KONST(0x20), cl) \
390
-	EMIT1(je, LABELREF(1, f)) \
391
-	EMIT1(ja, LABELREF(2, f)) \
392
-	EMIT2(shr, cl, eax) \
393
-	EMIT1(setc, bl) \
394
-	EMIT1(jmp, LABELREF(0, f)) \
395
-	LABEL(1) \
396
-	EMIT2(test, eax, eax) \
397
-	EMIT1(sets, bl) \
398
-	EMIT2(xor, eax, eax) \
399
-	EMIT1(jmp, LABELREF(0, f)) \
400
-	LABEL(2) \
401
-	EMIT2(xor, ebx, ebx) \
402
-	EMIT2(xor, eax, eax) \
403
-	LABEL(0)
404
-#  define VALUE_LSR_REG_NC \
405
-	VALUE_LOAD_REG \
406
-	EMIT2(cmp, KONST(0x20), cl) \
407
-	EMIT1(jae, LABELREF(1, f)) \
408
-	EMIT2(shr, cl, eax) \
409
-	EMIT1(jmp, LABELREF(0, f)) \
410
-	LABEL(1) \
411
-	EMIT2(xor, eax, eax) \
412
-	LABEL(0)
413
-
414
-// OP Rd,Rb,Rm ASR #
415
-#  define VALUE_ASR_IMM_C \
416
-	VALUE_LOAD_IMM \
417
-	EMIT1(jz, LABELREF(1, f)) \
418
-	EMIT2(sar, cl, eax) \
419
-	EMIT1(setc, bl) \
420
-	EMIT1(jmp, LABELREF(0, f)) \
421
-	LABEL(1) \
422
-	EMIT2(sar, KONST(31), eax) \
423
-	EMIT1(sets, bl) \
424
-	LABEL(0)
425
-#  define VALUE_ASR_IMM_NC \
426
-	VALUE_LOAD_IMM \
427
-	EMIT1(jz, LABELREF(1, f)) \
428
-	EMIT2(sar, cl, eax) \
429
-	EMIT1(jmp, LABELREF(0, f)) \
430
-	LABEL(1) \
431
-	EMIT2(sar, KONST(31), eax) \
432
-	LABEL(0)
433
-
434
-// OP Rd,Rb,Rm ASR Rs
435
-#  define VALUE_ASR_REG_C \
436
-	VALUE_LOAD_REG \
437
-	EMIT2(test, cl, cl) \
438
-	EMIT1(jz, LABELREF(0, f)) \
439
-	EMIT2(cmp, KONST(0x20), cl) \
440
-	EMIT1(jae, LABELREF(1, f)) \
441
-	EMIT2(sar, cl, eax) \
442
-	EMIT1(setc, bl) \
443
-	EMIT1(jmp, LABELREF(0, f)) \
444
-	LABEL(1) \
445
-	EMIT2(sar, KONST(31), eax) \
446
-	EMIT1(sets, bl) \
447
-	LABEL(0)
448
-#  define VALUE_ASR_REG_NC \
449
-	VALUE_LOAD_REG \
450
-	EMIT2(cmp, KONST(0x20), cl) \
451
-	EMIT1(jae, LABELREF(1, f)) \
452
-	EMIT2(sar, cl, eax) \
453
-	EMIT1(jmp, LABELREF(0, f)) \
454
-	LABEL(1) \
455
-	EMIT2(sar, KONST(31), eax) \
456
-	LABEL(0)
457
-
458
-// OP Rd,Rb,Rm ROR #
459
-#  define VALUE_ROR_IMM_C \
460
-	VALUE_LOAD_IMM \
461
-	EMIT1(jz, LABELREF(1, f)) \
462
-	EMIT2(ror, cl, eax) \
463
-	EMIT1(jmp, LABELREF(0, f)) \
464
-	LABEL(1) \
465
-	EMIT2(bt, KONST(0), ebx) \
466
-	EMIT2(rcr, KONST(1), eax) \
467
-	LABEL(0) \
468
-	EMIT1(setc, bl)
469
-#  define VALUE_ROR_IMM_NC \
470
-	VALUE_LOAD_IMM \
471
-	EMIT1(jz, LABELREF(1, f)) \
472
-	EMIT2(ror, cl, eax) \
473
-	EMIT1(jmp, LABELREF(0, f)) \
474
-	LABEL(1) \
475
-	EMIT2(bt, KONST(0), VARL(C_FLAG)) \
476
-	EMIT2(rcr, KONST(1), eax) \
477
-	LABEL(0)
478
-
479
-// OP Rd,Rb,Rm ROR Rs
480
-#  define VALUE_ROR_REG_C \
481
-	VALUE_LOAD_REG \
482
-	EMIT2(bt, KONST(0), ebx) \
483
-	EMIT2(ror, cl, eax) \
484
-	EMIT1(setc, bl)
485
-#  define VALUE_ROR_REG_NC \
486
-	VALUE_LOAD_REG \
487
-	EMIT2(ror, cl, eax)
488
-
489
-// OP Rd,Rb,# ROR #
490
-#  define VALUE_IMM_C \
491
-	EMIT2(movzx, ch, ecx) \
492
-	EMIT2(add, ecx, ecx) \
493
-	EMIT2(movzx, al, eax) \
494
-	EMIT2(bt, KONST(0), ebx) \
495
-	EMIT2(ror, cl, eax) \
496
-	EMIT1(setc, bl)
497
-#  define VALUE_IMM_NC \
498
-	EMIT2(movzx, ch, ecx) \
499
-	EMIT2(add, ecx, ecx) \
500
-	EMIT2(movzx, al, eax) \
501
-	EMIT2(ror, cl, eax)
502
-
503
-// Macros to perform ALU ops
504
-
505
-// Set condition codes iff the destination register is not R15 (PC)
506
-#  define CHECK_PC(OP, SETCOND) \
507
-	EMIT2(cmp, KONST(0x3C), esi) \
508
-	EMIT1(je, LABELREF(8, f)) \
509
-	OP SETCOND \
510
-	EMIT1(jmp, LABELREF(9, f)) \
511
-	LABEL(8) \
512
-	OP \
513
-	LABEL(9)
514
-
515
-#  define OP_AND \
516
-	EMIT2(and, eax, edx) \
517
-	EMIT2(mov, edx, REGREF1(esi))
518
-#  define OP_ANDS CHECK_PC(OP_AND, SETCOND_LOGICAL)
519
-#  define OP_EOR \
520
-	EMIT2(xor, eax, edx) \
521
-	EMIT2(mov, edx, REGREF1(esi))
522
-#  define OP_EORS CHECK_PC(OP_EOR, SETCOND_LOGICAL)
523
-#  define OP_SUB \
524
-	EMIT2(sub, eax, edx) \
525
-	EMIT2(mov, edx, REGREF1(esi))
526
-#  define OP_SUBS CHECK_PC(OP_SUB, SETCOND_SUB)
527
-#  define OP_RSB \
528
-	EMIT2(sub, edx, eax) \
529
-	EMIT2(mov, eax, REGREF1(esi))
530
-#  define OP_RSBS CHECK_PC(OP_RSB, SETCOND_SUB)
531
-#  define OP_ADD \
532
-	EMIT2(add, eax, edx) \
533
-	EMIT2(mov, edx, REGREF1(esi))
534
-#  define OP_ADDS CHECK_PC(OP_ADD, SETCOND_ADD)
535
-#  define OP_ADC \
536
-	EMIT2(bt, KONST(0), VARL(C_FLAG)) \
537
-	EMIT2(adc, eax, edx) \
538
-	EMIT2(mov, edx, REGREF1(esi))
539
-#  define OP_ADCS CHECK_PC(OP_ADC, SETCOND_ADD)
540
-#  define OP_SBC \
541
-	EMIT2(bt, KONST(0), VARL(C_FLAG)) \
542
-	EMIT0(cmc) \
543
-	EMIT2(sbb, eax, edx) \
544
-	EMIT2(mov, edx, REGREF1(esi))
545
-#  define OP_SBCS CHECK_PC(OP_SBC, SETCOND_SUB)
546
-#  define OP_RSC \
547
-	EMIT2(bt, KONST(0), VARL(C_FLAG)) \
548
-	EMIT0(cmc) \
549
-	EMIT2(sbb, edx, eax) \
550
-	EMIT2(mov, eax, REGREF1(esi))
551
-#  define OP_RSCS CHECK_PC(OP_RSC, SETCOND_SUB)
552
-#  define OP_TST \
553
-	EMIT2(and, eax, edx) \
554
-	SETCOND_LOGICAL
555
-#  define OP_TEQ \
556
-	EMIT2(xor, eax, edx) \
557
-	SETCOND_LOGICAL
558
-#  define OP_CMP \
559
-	EMIT2(sub, eax, edx) \
560
-	SETCOND_SUB
561
-#  define OP_CMN \
562
-	EMIT2(add, eax, edx) \
563
-	SETCOND_ADD
564
-#  define OP_ORR \
565
-	EMIT2(or, eax, edx) \
566
-	EMIT2(mov, edx, REGREF1(esi))
567
-#  define OP_ORRS CHECK_PC(OP_ORR, SETCOND_LOGICAL)
568
-#  define OP_MOV \
569
-	EMIT2(mov, eax, REGREF1(esi))
570
-#  define OP_MOVS CHECK_PC(EMIT2(test, eax, eax) EMIT2(mov, eax, REGREF1(esi)), SETCOND_LOGICAL)
571
-#  define OP_BIC \
572
-	EMIT1(not, eax) \
573
-	EMIT2(and, eax, edx) \
574
-	EMIT2(mov, edx, REGREF1(esi))
575
-#  define OP_BICS CHECK_PC(OP_BIC, SETCOND_LOGICAL)
576
-#  define OP_MVN \
577
-	EMIT1(not, eax) \
578
-	EMIT2(mov, eax, REGREF1(esi))
579
-#  define OP_MVNS CHECK_PC(OP_MVN EMIT2(test, eax, eax), SETCOND_LOGICAL)
580
-
581
-// ALU cleanup macro
582
-#  define ALU_FINISH ALU_TRAILER
583
-
584
-// End of ALU macros
585
-//X//#endif //_MSC_VER
586
-#  ifdef __GNUC__
587
-#   define ROR_IMM_MSR \
588
-	asm("ror %%cl, %%eax;" \
589
-		: "=a" (value) \
590
-		: "a" (opcode & 0xFF), "c" (shift));
591
-
592
-#   define ROR_OFFSET \
593
-	asm("ror %%cl, %0" \
594
-		: "=r" (offset) \
595
-		: "0" (offset), "c" (shift));
596
-
597
-#   define RRX_OFFSET \
598
-	asm(EMIT2(btl, KONST(0), VAR(C_FLAG)) \
599
-		"rcr $1, %0" \
600
-		: "=r" (offset) \
601
-		: "0" (offset));
602
-#  else  // !__GNUC__, i.e. Visual C++
603
-#   define ROR_IMM_MSR \
604
-	__asm \
605
-	{ \
606
-		__asm mov ecx, shift \
607
-		__asm ror value, cl \
608
-	}
609
-
610
-#   define ROR_OFFSET \
611
-	__asm \
612
-	{ \
613
-		__asm mov ecx, shift \
614
-		__asm ror offset, cl \
615
-	}
616
-
617
-#   define RRX_OFFSET \
618
-	__asm \
619
-	{ \
620
-		__asm bt dword ptr C_FLAG, 0 \
621
-		__asm rcr offset, 1 \
622
-	}
623
-#  endif  // !__GNUC__
624
-# endif  // !__POWERPC__
625
-#endif  // !C_CORE
626
-
627 55
 // C core
628 56
 
629 57
 #define C_SETCOND_LOGICAL \
... ...
@@ -641,15 +69,12 @@ template<typename T> static inline T POS(const T &i) { return ~i >> 31; }
641 69
 	V_FLAG = !!((NEG(lhs) & POS(rhs) & POS(res)) | (POS(lhs) & NEG(rhs) & NEG(res))); \
642 70
 	C_FLAG = !!((NEG(lhs) & POS(rhs)) | (NEG(lhs) & POS(res)) | (POS(rhs) & POS(res)));
643 71
 
644
-#ifndef ALU_INIT_C
645
-# define ALU_INIT_C \
72
+#define ALU_INIT_C \
646 73
 	int dest = (opcode >> 12) & 15; \
647 74
 	bool C_OUT = C_FLAG; \
648 75
 	uint32_t value;
649
-#endif
650 76
 // OP Rd,Rb,Rm LSL #
651
-#ifndef VALUE_LSL_IMM_C
652
-# define VALUE_LSL_IMM_C \
77
+#define VALUE_LSL_IMM_C \
653 78
 	unsigned shift = (opcode >> 7) & 0x1F; \
654 79
 	if (LIKELY(!shift)) /* LSL #0 most common? */ \
655 80
 		value = reg[opcode & 0x0F].I; \
... ...
@@ -659,10 +84,8 @@ template<typename T> static inline T POS(const T &i) { return ~i >> 31; }
659 84
 		C_OUT = !!((v >> (32 - shift)) & 1); \
660 85
 		value = v << shift; \
661 86
 	}
662
-#endif
663 87
 // OP Rd,Rb,Rm LSL Rs
664
-#ifndef VALUE_LSL_REG_C
665
-# define VALUE_LSL_REG_C \
88
+#define VALUE_LSL_REG_C \
666 89
 	uint32_t shift = reg[(opcode >> 8) & 15].B.B0; \
667 90
 	uint32_t rm = reg[opcode & 0x0F].I; \
668 91
 	if ((opcode & 0x0F) == 15) \
... ...
@@ -688,10 +111,8 @@ template<typename T> static inline T POS(const T &i) { return ~i >> 31; }
688 111
 	} \
689 112
 	else \
690 113
 		value = rm;
691
-#endif
692 114
 // OP Rd,Rb,Rm LSR #
693
-#ifndef VALUE_LSR_IMM_C
694
-# define VALUE_LSR_IMM_C \
115
+#define VALUE_LSR_IMM_C \
695 116
 	uint32_t shift = (opcode >> 7) & 0x1F; \
696 117
 	if (LIKELY(shift)) \
697 118
 	{ \
... ...
@@ -704,10 +125,8 @@ template<typename T> static inline T POS(const T &i) { return ~i >> 31; }
704 125
 		value = 0; \
705 126
 		C_OUT = !!(reg[opcode & 0x0F].I & 0x80000000); \
706 127
 	}
707
-#endif
708 128
 // OP Rd,Rb,Rm LSR Rs
709
-#ifndef VALUE_LSR_REG_C
710
-# define VALUE_LSR_REG_C \
129
+#define VALUE_LSR_REG_C \
711 130
 	unsigned shift = reg[(opcode >> 8) & 15].B.B0; \
712 131
 	uint32_t rm = reg[opcode & 0x0F].I; \
713 132
 	if ((opcode & 0x0F) == 15) \
... ...
@@ -733,10 +152,8 @@ template<typename T> static inline T POS(const T &i) { return ~i >> 31; }
733 152
 	} \
734 153
 	else \
735 154
 		value = rm;
736
-#endif
737 155
 // OP Rd,Rb,Rm ASR #
738
-#ifndef VALUE_ASR_IMM_C
739
-# define VALUE_ASR_IMM_C \
156
+#define VALUE_ASR_IMM_C \
740 157
 	unsigned shift = (opcode >> 7) & 0x1F; \
741 158
 	if (LIKELY(shift)) \
742 159
 	{ \
... ...
@@ -758,10 +175,8 @@ template<typename T> static inline T POS(const T &i) { return ~i >> 31; }
758 175
 			C_OUT = false; \
759 176
 		} \
760 177
 	}
761
-#endif
762 178
 // OP Rd,Rb,Rm ASR Rs
763
-#ifndef VALUE_ASR_REG_C
764
-# define VALUE_ASR_REG_C \
179
+#define VALUE_ASR_REG_C \
765 180
 	unsigned shift = reg[(opcode >> 8) & 15].B.B0; \
766 181
 	uint32_t rm = reg[opcode & 0x0F].I; \
767 182
 	if ((opcode & 0x0F) == 15) \
... ...
@@ -790,10 +205,8 @@ template<typename T> static inline T POS(const T &i) { return ~i >> 31; }
790 205
 			C_OUT = false; \
791 206
 		} \
792 207
 	}
793
-#endif
794 208
 // OP Rd,Rb,Rm ROR #
795
-#ifndef VALUE_ROR_IMM_C
796
-# define VALUE_ROR_IMM_C \
209
+#define VALUE_ROR_IMM_C \
797 210
 	unsigned shift = (opcode >> 7) & 0x1F; \
798 211
 	uint32_t v = reg[opcode & 0x0F].I; \
799 212
 	if (LIKELY(shift)) \
... ...
@@ -806,10 +219,8 @@ template<typename T> static inline T POS(const T &i) { return ~i >> 31; }
806 219
 		C_OUT = !!(v & 1); \
807 220
 		value = (v >> 1) | (C_FLAG << 31); \
808 221
 	}
809
-#endif
810 222
 // OP Rd,Rb,Rm ROR Rs
811
-#ifndef VALUE_ROR_REG_C
812
-# define VALUE_ROR_REG_C \
223
+#define VALUE_ROR_REG_C \
813 224
 	unsigned shift = reg[(opcode >> 8) & 15].B.B0; \
814 225
 	uint32_t rm = reg[opcode & 0x0F].I; \
815 226
 	if ((opcode & 0x0F) == 15) \
... ...
@@ -826,10 +237,8 @@ template<typename T> static inline T POS(const T &i) { return ~i >> 31; }
826 237
 		if (shift) \
827 238
 			C_OUT = !!(value & 0x80000000); \
828 239
 	}
829
-#endif
830 240
 // OP Rd,Rb,# ROR #
831
-#ifndef VALUE_IMM_C
832
-# define VALUE_IMM_C \
241
+#define VALUE_IMM_C \
833 242
 	int shift = (opcode & 0xF00) >> 7; \
834 243
 	if (UNLIKELY(shift)) \
835 244
 	{ \
... ...
@@ -839,206 +248,115 @@ template<typename T> static inline T POS(const T &i) { return ~i >> 31; }
839 248
 	} \
840 249
 	else \
841 250
 		value = opcode & 0xFF;
842
-#endif
843 251
 
844 252
 // Make the non-carry versions default to the carry versions
845 253
 // (this is fine for C--the compiler will optimize the dead code out)
846
-#ifndef ALU_INIT_NC
847
-# define ALU_INIT_NC ALU_INIT_C
848
-#endif
849
-#ifndef VALUE_LSL_IMM_NC
850
-# define VALUE_LSL_IMM_NC VALUE_LSL_IMM_C
851
-#endif
852
-#ifndef VALUE_LSL_REG_NC
853
-# define VALUE_LSL_REG_NC VALUE_LSL_REG_C
854
-#endif
855
-#ifndef VALUE_LSR_IMM_NC
856
-# define VALUE_LSR_IMM_NC VALUE_LSR_IMM_C
857
-#endif
858
-#ifndef VALUE_LSR_REG_NC
859
-# define VALUE_LSR_REG_NC VALUE_LSR_REG_C
860
-#endif
861
-#ifndef VALUE_ASR_IMM_NC
862
-# define VALUE_ASR_IMM_NC VALUE_ASR_IMM_C
863
-#endif
864
-#ifndef VALUE_ASR_REG_NC
865
-# define VALUE_ASR_REG_NC VALUE_ASR_REG_C
866
-#endif
867
-#ifndef VALUE_ROR_IMM_NC
868
-# define VALUE_ROR_IMM_NC VALUE_ROR_IMM_C
869
-#endif
870
-#ifndef VALUE_ROR_REG_NC
871
-# define VALUE_ROR_REG_NC VALUE_ROR_REG_C
872
-#endif
873
-#ifndef VALUE_IMM_NC
874
-# define VALUE_IMM_NC VALUE_IMM_C
875
-#endif
254
+#define ALU_INIT_NC ALU_INIT_C
255
+#define VALUE_LSL_IMM_NC VALUE_LSL_IMM_C
256
+#define VALUE_LSL_REG_NC VALUE_LSL_REG_C
257
+#define VALUE_LSR_IMM_NC VALUE_LSR_IMM_C
258
+#define VALUE_LSR_REG_NC VALUE_LSR_REG_C
259
+#define VALUE_ASR_IMM_NC VALUE_ASR_IMM_C
260
+#define VALUE_ASR_REG_NC VALUE_ASR_REG_C
261
+#define VALUE_ROR_IMM_NC VALUE_ROR_IMM_C
262
+#define VALUE_ROR_REG_NC VALUE_ROR_REG_C
263
+#define VALUE_IMM_NC VALUE_IMM_C
876 264
 
877 265
 #define C_CHECK_PC(SETCOND) if (LIKELY(dest != 15)) { SETCOND }
878
-#ifndef OP_AND
879
-# define OP_AND \
266
+#define OP_AND \
880 267
 	uint32_t res = reg[(opcode >> 16) & 15].I & value; \
881
-	reg[dest].I = res;
882
-#endif
883
-#ifndef OP_ANDS
884
-# define OP_ANDS OP_AND C_CHECK_PC(C_SETCOND_LOGICAL)
885
-#endif
886
-#ifndef OP_EOR
887
-# define OP_EOR \
268
+    reg[dest].I = res;
269
+#define OP_ANDS OP_AND C_CHECK_PC(C_SETCOND_LOGICAL)
270
+#define OP_EOR \
888 271
 	uint32_t res = reg[(opcode >> 16) & 15].I ^ value; \
889 272
 	reg[dest].I = res;
890
-#endif
891
-#ifndef OP_EORS
892
-# define OP_EORS OP_EOR C_CHECK_PC(C_SETCOND_LOGICAL)
893
-#endif
894
-#ifndef OP_SUB
895
-# define OP_SUB \
273
+#define OP_EORS OP_EOR C_CHECK_PC(C_SETCOND_LOGICAL)
274
+#define OP_SUB \
896 275
 	uint32_t lhs = reg[(opcode >> 16) & 15].I; \
897 276
 	uint32_t rhs = value; \
898 277
 	uint32_t res = lhs - rhs; \
899 278
 	reg[dest].I = res;
900
-#endif
901
-#ifndef OP_SUBS
902
-# define OP_SUBS OP_SUB C_CHECK_PC(C_SETCOND_SUB)
903
-#endif
904
-#ifndef OP_RSB
905
-# define OP_RSB \
279
+#define OP_SUBS OP_SUB C_CHECK_PC(C_SETCOND_SUB)
280
+#define OP_RSB \
906 281
 	uint32_t lhs = value; \
907 282
 	uint32_t rhs = reg[(opcode >> 16) & 15].I; \
908 283
 	uint32_t res = lhs - rhs; \
909 284
 	reg[dest].I = res;
910
-#endif
911
-#ifndef OP_RSBS
912
-# define OP_RSBS OP_RSB C_CHECK_PC(C_SETCOND_SUB)
913
-#endif
914
-#ifndef OP_ADD
915
-# define OP_ADD \
285
+#define OP_RSBS OP_RSB C_CHECK_PC(C_SETCOND_SUB)
286
+#define OP_ADD \
916 287
 	uint32_t lhs = reg[(opcode >> 16) & 15].I; \
917 288
 	uint32_t rhs = value; \
918 289
 	uint32_t res = lhs + rhs; \
919 290
 	reg[dest].I = res;
920
-#endif
921
-#ifndef OP_ADDS
922
-# define OP_ADDS OP_ADD C_CHECK_PC(C_SETCOND_ADD)
923
-#endif
924
-#ifndef OP_ADC
925
-# define OP_ADC \
291
+#define OP_ADDS OP_ADD C_CHECK_PC(C_SETCOND_ADD)
292
+#define OP_ADC \
926 293
 	uint32_t lhs = reg[(opcode >> 16) & 15].I; \
927 294
 	uint32_t rhs = value; \
928 295
 	uint32_t res = lhs + rhs + static_cast<uint32_t>(C_FLAG); \
929 296
 	reg[dest].I = res;
930
-#endif
931
-#ifndef OP_ADCS
932
-# define OP_ADCS OP_ADC C_CHECK_PC(C_SETCOND_ADD)
933
-#endif
934
-#ifndef OP_SBC
935
-# define OP_SBC \
297
+#define OP_ADCS OP_ADC C_CHECK_PC(C_SETCOND_ADD)
298
+#define OP_SBC \
936 299
 	uint32_t lhs = reg[(opcode >> 16) & 15].I; \
937 300
 	uint32_t rhs = value; \
938 301
 	uint32_t res = lhs - rhs - !static_cast<uint32_t>(C_FLAG); \
939 302
 	reg[dest].I = res;
940
-#endif
941
-#ifndef OP_SBCS
942
-# define OP_SBCS OP_SBC C_CHECK_PC(C_SETCOND_SUB)
943
-#endif
944
-#ifndef OP_RSC
945
-# define OP_RSC \
303
+#define OP_SBCS OP_SBC C_CHECK_PC(C_SETCOND_SUB)
304
+#define OP_RSC \
946 305
 	uint32_t lhs = value; \
947 306
 	uint32_t rhs = reg[(opcode >> 16) & 15].I; \
948 307
 	uint32_t res = lhs - rhs - !static_cast<uint32_t>(C_FLAG); \
949 308
 	reg[dest].I = res;
950
-#endif
951
-#ifndef OP_RSCS
952
-# define OP_RSCS OP_RSC C_CHECK_PC(C_SETCOND_SUB)
953
-#endif
954
-#ifndef OP_TST
955
-# define OP_TST \
309
+#define OP_RSCS OP_RSC C_CHECK_PC(C_SETCOND_SUB)
310
+#define OP_TST \
956 311
 	uint32_t res = reg[(opcode >> 16) & 0x0F].I & value; \
957 312
 	C_SETCOND_LOGICAL;
958
-#endif
959
-#ifndef OP_TEQ
960
-# define OP_TEQ \
313
+#define OP_TEQ \
961 314
 	uint32_t res = reg[(opcode >> 16) & 0x0F].I ^ value; \
962 315
 	C_SETCOND_LOGICAL;
963
-#endif
964
-#ifndef OP_CMP
965
-# define OP_CMP \
316
+#define OP_CMP \
966 317
 	uint32_t lhs = reg[(opcode >> 16) & 15].I; \
967 318
 	uint32_t rhs = value; \
968 319
 	uint32_t res = lhs - rhs; \
969 320
 	C_SETCOND_SUB;
970
-#endif
971
-#ifndef OP_CMN
972
-# define OP_CMN \
321
+#define OP_CMN \
973 322
 	uint32_t lhs = reg[(opcode >> 16) & 15].I; \
974 323
 	uint32_t rhs = value; \
975 324
 	uint32_t res = lhs + rhs; \
976 325
 	C_SETCOND_ADD;
977
-#endif
978
-#ifndef OP_ORR
979
-# define OP_ORR \
326
+#define OP_ORR \
980 327
 	uint32_t res = reg[(opcode >> 16) & 0x0F].I | value; \
981 328
 	reg[dest].I = res;
982
-#endif
983
-#ifndef OP_ORRS
984
-# define OP_ORRS OP_ORR C_CHECK_PC(C_SETCOND_LOGICAL)
985
-#endif
986
-#ifndef OP_MOV
987
-# define OP_MOV \
329
+#define OP_ORRS OP_ORR C_CHECK_PC(C_SETCOND_LOGICAL)
330
+#define OP_MOV \
988 331
 	uint32_t res = value; \
989 332
 	reg[dest].I = res;
990
-#endif
991
-#ifndef OP_MOVS
992
-# define OP_MOVS OP_MOV C_CHECK_PC(C_SETCOND_LOGICAL)
993
-#endif
994
-#ifndef OP_BIC
995
-# define OP_BIC \
333
+#define OP_MOVS OP_MOV C_CHECK_PC(C_SETCOND_LOGICAL)
334
+#define OP_BIC \
996 335
 	uint32_t res = reg[(opcode >> 16) & 0x0F].I & ~value; \
997 336
 	reg[dest].I = res;
998
-#endif
999
-#ifndef OP_BICS
1000
-# define OP_BICS OP_BIC C_CHECK_PC(C_SETCOND_LOGICAL)
1001
-#endif
1002
-#ifndef OP_MVN
1003
-# define OP_MVN \
337
+#define OP_BICS OP_BIC C_CHECK_PC(C_SETCOND_LOGICAL)
338
+#define OP_MVN \
1004 339
 	uint32_t res = ~value; \
1005 340
 	reg[dest].I = res;
1006
-#endif
1007
-#ifndef OP_MVNS
1008
-# define OP_MVNS OP_MVN C_CHECK_PC(C_SETCOND_LOGICAL)
1009
-#endif
341
+#define OP_MVNS   OP_MVN C_CHECK_PC(C_SETCOND_LOGICAL)
1010 342
 
1011
-#ifndef SETCOND_NONE
1012
-# define SETCOND_NONE /*nothing*/
1013
-#endif
1014
-#ifndef SETCOND_MUL
1015
-# define SETCOND_MUL \
343
+#define SETCOND_NONE /*nothing*/
344
+#define SETCOND_MUL \
1016 345
 	N_FLAG = static_cast<int32_t>(reg[dest].I) < 0; \
1017 346
 	Z_FLAG = !reg[dest].I;
1018
-#endif
1019
-#ifndef SETCOND_MULL
1020
-# define SETCOND_MULL \
347
+#define SETCOND_MULL \
1021 348
 	N_FLAG = !!(reg[dest].I & 0x80000000); \
1022 349
 	Z_FLAG = !(reg[dest].I || reg[acc].I);
1023
-#endif
1024 350
 
1025
-#ifndef ALU_FINISH
1026
-# define ALU_FINISH /*nothing*/
1027
-#endif
351
+#define ALU_FINISH /*nothing*/
1028 352
 
1029
-#ifndef ROR_IMM_MSR
1030
-# define ROR_IMM_MSR \
353
+#define ROR_IMM_MSR \
1031 354
 	uint32_t v = opcode & 0xff; \
1032 355
 	value = (v << (32 - shift)) | (v >> shift);
1033
-#endif
1034
-#ifndef ROR_OFFSET
1035
-# define ROR_OFFSET \
356
+#define ROR_OFFSET \
1036 357
 	offset = (offset << (32 - shift)) | (offset >> shift);
1037
-#endif
1038
-#ifndef RRX_OFFSET
1039
-# define RRX_OFFSET \
358
+#define RRX_OFFSET \
1040 359
 	offset = (offset >> 1) | (static_cast<int>(C_FLAG) << 31);
1041
-#endif
1042 360
 
1043 361
 // ALU ops (except multiply) //////////////////////////////////////////////
1044 362
 
... ...
@@ -1461,13 +779,9 @@ static INSN_REGPARM void arm121(uint32_t opcode)
1461 779
 	int shift = (opcode >> 7) & 31; \
1462 780
 	uint32_t offset = reg[opcode & 15].I; \
1463 781
 	if (shift) \
1464
-	{ \
1465
-		ROR_OFFSET; \
1466
-	} \
782
+		ROR_OFFSET \
1467 783
 	else \
1468
-	{ \
1469
-		RRX_OFFSET; \
1470
-	}
784
+		RRX_OFFSET
1471 785
 
1472 786
 #define ADDRESS_POST (reg[base].I)
1473 787
 #define ADDRESS_PREDEC (reg[base].I - offset)
... ...
@@ -2241,9 +1555,9 @@ static INSN_REGPARM void arm8A0(uint32_t opcode)
2241 1555
 	if (!busPrefetchCount)
2242 1556
 		busPrefetch = busPrefetchEnable;
2243 1557
 	int base = (opcode & 0x000F0000) >> 16;
2244
-	uint32_t temp = reg[base].I + 4 * (cpuBitsSet[opcode & 0xFF] + cpuBitsSet[(opcode >> 8) & 255]);
2245 1558
 	uint32_t address = reg[base].I & 0xFFFFFFFC;
2246 1559
 	int count = 0;
1560
+	uint32_t temp = reg[base].I + 4 * (cpuBitsSet[opcode & 0xFF] + cpuBitsSet[(opcode >> 8) & 255]);
2247 1561
 	STMW_ALL;
2248 1562
 	clockTicks += 1 + codeTicksAccess32(armNextPC);
2249 1563
 }
... ...
@@ -2294,9 +1608,9 @@ static INSN_REGPARM void arm8E0(uint32_t opcode)
2294 1608
 	if (!busPrefetchCount)
2295 1609
 		busPrefetch = busPrefetchEnable;
2296 1610
 	int base = (opcode & 0x000F0000) >> 16;
2297
-	uint32_t temp = reg[base].I + 4 * (cpuBitsSet[opcode & 0xFF] + cpuBitsSet[(opcode >> 8) & 255]);
2298 1611
 	uint32_t address = reg[base].I & 0xFFFFFFFC;
2299 1612
 	int count = 0;
1613
+	uint32_t temp = reg[base].I + 4 * (cpuBitsSet[opcode & 0xFF] + cpuBitsSet[(opcode >> 8) & 255]);
2300 1614
 	STMW_ALL_2;
2301 1615
 	clockTicks += 1 + codeTicksAccess32(armNextPC);
2302 1616
 }
... ...
@@ -2457,9 +1771,9 @@ static INSN_REGPARM void arm9A0(uint32_t opcode)
2457 1771
 	if (!busPrefetchCount)
2458 1772
 		busPrefetch = busPrefetchEnable;
2459 1773
 	int base = (opcode & 0x000F0000) >> 16;
2460
-	uint32_t temp = reg[base].I + 4 * (cpuBitsSet[opcode & 0xFF] + cpuBitsSet[(opcode >> 8) & 255]);
2461 1774
 	uint32_t address = (reg[base].I + 4) & 0xFFFFFFFC;
2462 1775
 	int count = 0;
1776
+	uint32_t temp = reg[base].I + 4 * (cpuBitsSet[opcode & 0xFF] + cpuBitsSet[(opcode >> 8) & 255]);
2463 1777
 	STMW_ALL;
2464 1778
 	clockTicks += 1 + codeTicksAccess32(armNextPC);
2465 1779
 }
... ...
@@ -2510,9 +1824,9 @@ static INSN_REGPARM void arm9E0(uint32_t opcode)
2510 1824
 	if (!busPrefetchCount)
2511 1825
 		busPrefetch = busPrefetchEnable;
2512 1826
 	int base = (opcode & 0x000F0000) >> 16;
2513
-	uint32_t temp = reg[base].I + 4 * (cpuBitsSet[opcode & 0xFF] + cpuBitsSet[(opcode >> 8) & 255]);
2514 1827
 	uint32_t address = (reg[base].I + 4) & 0xFFFFFFFC;
2515 1828
 	int count = 0;
1829
+	uint32_t temp = reg[base].I + 4 * (cpuBitsSet[opcode & 0xFF] + cpuBitsSet[(opcode >> 8) & 255]);
2516 1830
 	STMW_ALL_2;
2517 1831
 	clockTicks += 1 + codeTicksAccess32(armNextPC);
2518 1832
 }
... ...
@@ -2766,7 +2080,7 @@ static insnfunc_t armInsnTable[] =
2766 2080
 	REP16(arm_UI),REP16(arm_UI),REP16(arm_UI),REP16(arm_UI),  // E80
2767 2081
 	REP16(arm_UI),REP16(arm_UI),REP16(arm_UI),REP16(arm_UI),  // EC0
2768 2082
 
2769
-	REP256(armF00),                                           // F00
2083
+	REP256(armF00)                                            // F00
2770 2084
 };
2771 2085
 
2772 2086
 // Wrapper routine (execution loop) ///////////////////////////////////////
Browse code

[GSF] Some more code cleanup, also removed a few files that were unneeded.

Naram Qashat authored on 2013/05/16 01:25:34
Showing 1 changed files
... ...
@@ -24,8 +24,8 @@ static INSN_REGPARM void armUnknownInsn(uint32_t opcode)
24 24
 
25 25
 // Common macros //////////////////////////////////////////////////////////
26 26
 
27
-static inline uint32_t NEG(uint32_t i) { return i >> 31; }
28
-static inline uint32_t POS(uint32_t i) { return ~i >> 31; }
27
+template<typename T> static inline T NEG(const T &i) { return i >> 31; }
28
+template<typename T> static inline T POS(const T &i) { return ~i >> 31; }
29 29
 
30 30
 // The following macros are used for optimization; any not defined for a
31 31
 // particular compiler/CPU combination default to the C core versions.
... ...
@@ -240,11 +240,11 @@ static inline uint32_t POS(uint32_t i) { return ~i >> 31; }
240 240
 #   define esi "%%esi"
241 241
 #   define edi "%%edi"
242 242
 #   define movzx movzb
243
-#else
243
+#  else
244 244
 #   define ALU_HEADER __asm { __asm mov ecx, opcode
245 245
 #   define ALU_TRAILER }
246 246
 #   define EMIT0(op) __asm op
247
-#   define EMIT1(op,arg) __asm op arg
247
+#   define EMIT1(op, arg) __asm op arg
248 248
 #   define EMIT2(op, src, dest) __asm op dest, src
249 249
 #   define KONST(val) val
250 250
 #   define VAR(var) var
... ...
@@ -310,7 +310,7 @@ static inline uint32_t POS(uint32_t i) { return ~i >> 31; }
310 310
 	EMIT2(and, KONST(0x3C), esi)
311 311
 
312 312
 #  define LOAD_C_FLAG_YES EMIT2(mov, VAR(C_FLAG), bl)
313
-#  define LOAD_C_FLAG_NO  /*nothing*/
313
+#  define LOAD_C_FLAG_NO /*nothing*/
314 314
 #  define ALU_INIT_C ALU_INIT(LOAD_C_FLAG_YES)
315 315
 #  define ALU_INIT_NC ALU_INIT(LOAD_C_FLAG_NO)
316 316
 
... ...
@@ -579,7 +579,7 @@ static inline uint32_t POS(uint32_t i) { return ~i >> 31; }
579 579
 #  define OP_MVNS CHECK_PC(OP_MVN EMIT2(test, eax, eax), SETCOND_LOGICAL)
580 580
 
581 581
 // ALU cleanup macro
582
-#  define ALU_FINISH  ALU_TRAILER
582
+#  define ALU_FINISH ALU_TRAILER
583 583
 
584 584
 // End of ALU macros
585 585
 //X//#endif //_MSC_VER
... ...
@@ -599,7 +599,6 @@ static inline uint32_t POS(uint32_t i) { return ~i >> 31; }
599 599
 		"rcr $1, %0" \
600 600
 		: "=r" (offset) \
601 601
 		: "0" (offset));
602
-
603 602
 #  else  // !__GNUC__, i.e. Visual C++
604 603
 #   define ROR_IMM_MSR \
605 604
 	__asm \
... ...
@@ -621,7 +620,6 @@ static inline uint32_t POS(uint32_t i) { return ~i >> 31; }
621 620
 		__asm bt dword ptr C_FLAG, 0 \
622 621
 		__asm rcr offset, 1 \
623 622
 	}
624
-
625 623
 #  endif  // !__GNUC__
626 624
 # endif  // !__POWERPC__
627 625
 #endif  // !C_CORE
... ...
@@ -688,7 +686,7 @@ static inline uint32_t POS(uint32_t i) { return ~i >> 31; }
688 686
 			C_OUT = false; \
689 687
 		} \
690 688
 	} \
691
-	else
689
+	else \
692 690
 		value = rm;
693 691
 #endif
694 692
 // OP Rd,Rb,Rm LSR #
... ...
@@ -733,7 +731,7 @@ static inline uint32_t POS(uint32_t i) { return ~i >> 31; }
733 731
 			C_OUT = false; \
734 732
 		} \
735 733
 	} \
736
-	else
734
+	else \
737 735
 		value = rm;
738 736
 #endif
739 737
 // OP Rd,Rb,Rm ASR #
... ...
@@ -797,15 +795,14 @@ static inline uint32_t POS(uint32_t i) { return ~i >> 31; }
797 795
 #ifndef VALUE_ROR_IMM_C
798 796
 # define VALUE_ROR_IMM_C \
799 797
 	unsigned shift = (opcode >> 7) & 0x1F; \
798
+	uint32_t v = reg[opcode & 0x0F].I; \
800 799
 	if (LIKELY(shift)) \
801 800
 	{ \
802
-		uint32_t v = reg[opcode & 0x0F].I; \
803 801
 		C_OUT = !!((v >> (shift - 1)) & 1); \
804 802
 		value = (v << (32 - shift)) | (v >> shift); \
805 803
 	} \
806 804
 	else \
807 805
 	{ \
808
-		uint32_t v = reg[opcode & 0x0F].I; \
809 806
 		C_OUT = !!(v & 1); \
810 807
 		value = (v >> 1) | (C_FLAG << 31); \
811 808
 	}
... ...
@@ -815,12 +812,12 @@ static inline uint32_t POS(uint32_t i) { return ~i >> 31; }
815 812
 # define VALUE_ROR_REG_C \
816 813
 	unsigned shift = reg[(opcode >> 8) & 15].B.B0; \
817 814
 	uint32_t rm = reg[opcode & 0x0F].I; \
818
-	if ((opcode & 0x0F) == 15)
815
+	if ((opcode & 0x0F) == 15) \
819 816
 		rm += 4; \
820 817
 	if (LIKELY(shift & 0x1F)) \
821 818
 	{ \
822 819
 		uint32_t v = rm; \
823
-		C_OUT = !((v >> (shift - 1)) & 1); \
820
+		C_OUT = !!((v >> (shift - 1)) & 1); \
824 821
 		value = (v << (32 - shift)) | (v >> shift); \
825 822
 	} \
826 823
 	else \
... ...
@@ -912,7 +909,7 @@ static inline uint32_t POS(uint32_t i) { return ~i >> 31; }
912 909
 	reg[dest].I = res;
913 910
 #endif
914 911
 #ifndef OP_RSBS
915
-# define OP_RSBS   OP_RSB C_CHECK_PC(C_SETCOND_SUB)
912
+# define OP_RSBS OP_RSB C_CHECK_PC(C_SETCOND_SUB)
916 913
 #endif
917 914
 #ifndef OP_ADD
918 915
 # define OP_ADD \
... ...
@@ -1075,7 +1072,7 @@ static inline uint32_t POS(uint32_t i) { return ~i >> 31; }
1075 1072
 		clockTicks = 3 + ISREGSHIFT + codeTicksAccess32(armNextPC) + codeTicksAccessSeq32(armNextPC) + codeTicksAccessSeq32(armNextPC); \
1076 1073
 	}
1077 1074
 
1078
-#define MODECHANGE_NO  /*nothing*/
1075
+#define MODECHANGE_NO /*nothing*/
1079 1076
 #define MODECHANGE_YES CPUSwitchMode(reg[17].I & 0x1f, false);
1080 1077
 
1081 1078
 #define DEFINE_ALU_INSN_C(CODE1, CODE2, OP, MODECHANGE) \
... ...
@@ -1100,74 +1097,74 @@ static inline uint32_t POS(uint32_t i) { return ~i >> 31; }
1100 1097
 	static INSN_REGPARM void arm##CODE2##0(uint32_t opcode) { ALU_INSN(ALU_INIT_NC, VALUE_IMM_NC, OP_##OP, MODECHANGE_##MODECHANGE, 0); }
1101 1098
 
1102 1099
 // AND
1103
-DEFINE_ALU_INSN_NC(00, 20, AND,  NO)
1100
+DEFINE_ALU_INSN_NC(00, 20, AND, NO)
1104 1101
 // ANDS
1105 1102
 DEFINE_ALU_INSN_C(01, 21, ANDS, YES)
1106 1103
 
1107 1104
 // EOR
1108
-DEFINE_ALU_INSN_NC(02, 22, EOR,  NO)
1105
+DEFINE_ALU_INSN_NC(02, 22, EOR, NO)
1109 1106
 // EORS
1110 1107
 DEFINE_ALU_INSN_C(03, 23, EORS, YES)
1111 1108
 
1112 1109
 // SUB
1113
-DEFINE_ALU_INSN_NC(04, 24, SUB,  NO)
1110
+DEFINE_ALU_INSN_NC(04, 24, SUB, NO)
1114 1111
 // SUBS
1115 1112
 DEFINE_ALU_INSN_NC(05, 25, SUBS, YES)
1116 1113
 
1117 1114
 // RSB
1118
-DEFINE_ALU_INSN_NC(06, 26, RSB,  NO)
1115
+DEFINE_ALU_INSN_NC(06, 26, RSB, NO)
1119 1116
 // RSBS
1120 1117
 DEFINE_ALU_INSN_NC(07, 27, RSBS, YES)
1121 1118
 
1122 1119
 // ADD
1123
-DEFINE_ALU_INSN_NC(08, 28, ADD,  NO)
1120
+DEFINE_ALU_INSN_NC(08, 28, ADD, NO)
1124 1121
 // ADDS
1125 1122
 DEFINE_ALU_INSN_NC(09, 29, ADDS, YES)
1126 1123
 
1127 1124
 // ADC
1128
-DEFINE_ALU_INSN_NC(0A, 2A, ADC,  NO)
1125
+DEFINE_ALU_INSN_NC(0A, 2A, ADC, NO)
1129 1126
 // ADCS
1130 1127
 DEFINE_ALU_INSN_NC(0B, 2B, ADCS, YES)
1131 1128
 
1132 1129
 // SBC
1133
-DEFINE_ALU_INSN_NC(0C, 2C, SBC,  NO)
1130
+DEFINE_ALU_INSN_NC(0C, 2C, SBC, NO)
1134 1131
 // SBCS
1135 1132
 DEFINE_ALU_INSN_NC(0D, 2D, SBCS, YES)
1136 1133
 
1137 1134
 // RSC
1138
-DEFINE_ALU_INSN_NC(0E, 2E, RSC,  NO)
1135
+DEFINE_ALU_INSN_NC(0E, 2E, RSC, NO)
1139 1136
 // RSCS
1140 1137
 DEFINE_ALU_INSN_NC(0F, 2F, RSCS, YES)
1141 1138
 
1142 1139
 // TST
1143
-DEFINE_ALU_INSN_C(11, 31, TST,  NO)
1140
+DEFINE_ALU_INSN_C(11, 31, TST, NO)
1144 1141
 
1145 1142
 // TEQ
1146
-DEFINE_ALU_INSN_C(13, 33, TEQ,  NO)
1143
+DEFINE_ALU_INSN_C(13, 33, TEQ, NO)
1147 1144
 
1148 1145
 // CMP
1149
-DEFINE_ALU_INSN_NC(15, 35, CMP,  NO)
1146
+DEFINE_ALU_INSN_NC(15, 35, CMP, NO)
1150 1147
 
1151 1148
 // CMN
1152
-DEFINE_ALU_INSN_NC(17, 37, CMN,  NO)
1149
+DEFINE_ALU_INSN_NC(17, 37, CMN, NO)
1153 1150
 
1154 1151
 // ORR
1155
-DEFINE_ALU_INSN_NC(18, 38, ORR,  NO)
1152
+DEFINE_ALU_INSN_NC(18, 38, ORR, NO)
1156 1153
 // ORRS
1157 1154
 DEFINE_ALU_INSN_C(19, 39, ORRS, YES)
1158 1155
 
1159 1156
 // MOV
1160
-DEFINE_ALU_INSN_NC(1A, 3A, MOV,  NO)
1157
+DEFINE_ALU_INSN_NC(1A, 3A, MOV, NO)
1161 1158
 // MOVS
1162 1159
 DEFINE_ALU_INSN_C(1B, 3B, MOVS, YES)
1163 1160
 
1164 1161
 // BIC
1165
-DEFINE_ALU_INSN_NC(1C, 3C, BIC,  NO)
1162
+DEFINE_ALU_INSN_NC(1C, 3C, BIC, NO)
1166 1163
 // BICS
1167 1164
 DEFINE_ALU_INSN_C(1D, 3D, BICS, YES)
1168 1165
 
1169 1166
 // MVN
1170
-DEFINE_ALU_INSN_NC(1E, 3E, MVN,  NO)
1167
+DEFINE_ALU_INSN_NC(1E, 3E, MVN, NO)
1171 1168
 // MVNS
1172 1169
 DEFINE_ALU_INSN_C(1F, 3F, MVNS, YES)
1173 1170
 
... ...
@@ -1188,7 +1185,7 @@ DEFINE_ALU_INSN_C(1F, 3F, MVNS, YES)
1188 1185
 	if (!(rs & 0xFFFFFF00)) \
1189 1186
 		; /* No-op */ \
1190 1187
 	else if (!(rs & 0xFFFF0000)) \
1191
-		clockTicks += 1; \
1188
+		++clockTicks; \
1192 1189
 	else if (!(rs & 0xFF000000)) \
1193 1190
 		clockTicks += 2; \
1194 1191
 	else \
... ...
@@ -1261,7 +1258,7 @@ static INSN_REGPARM void arm149(uint32_t opcode)
1261 1258
 {
1262 1259
 	uint32_t address = reg[(opcode >> 16) & 15].I;
1263 1260
 	uint32_t temp = CPUReadByte(address);
1264
-	CPUWriteByte(address, reg[opcode&15].B.B0);
1261
+	CPUWriteByte(address, reg[opcode & 15].B.B0);
1265 1262
 	reg[(opcode >> 12) & 15].I = temp;
1266 1263
 	clockTicks = 4 + dataTicksAccess32(address) + dataTicksAccess32(address) + codeTicksAccess32(armNextPC);
1267 1264
 }
... ...
@@ -2043,7 +2040,7 @@ static INSN_REGPARM void arm7F6(uint32_t opcode) { LDR_PREINC_WB(OFFSET_ROR, OP_
2043 2040
 	STM_HIGH(STMW_REG); \
2044 2041
 	STMW_PC;
2045 2042
 #define LDM_ALL \
2046
-	LDM_LOW \
2043
+	LDM_LOW; \
2047 2044
 	LDM_HIGH; \
2048 2045
 	if (opcode & (1U << 15)) \
2049 2046
 	{ \
... ...
@@ -2062,7 +2059,7 @@ static INSN_REGPARM void arm7F6(uint32_t opcode) { LDR_PREINC_WB(OFFSET_ROR, OP_
2062 2059
 		clockTicks += 1 + codeTicksAccessSeq32(armNextPC); \
2063 2060
 	}
2064 2061
 #define STM_ALL_2 \
2065
-	STM_LOW(STM_REG) \
2062
+	STM_LOW(STM_REG); \
2066 2063
 	STM_HIGH_2(STM_REG); \
2067 2064
 	STM_PC;
2068 2065
 #define STMW_ALL_2 \
... ...
@@ -2244,9 +2241,9 @@ static INSN_REGPARM void arm8A0(uint32_t opcode)
2244 2241
 	if (!busPrefetchCount)
2245 2242
 		busPrefetch = busPrefetchEnable;
2246 2243
 	int base = (opcode & 0x000F0000) >> 16;
2244
+	uint32_t temp = reg[base].I + 4 * (cpuBitsSet[opcode & 0xFF] + cpuBitsSet[(opcode >> 8) & 255]);
2247 2245
 	uint32_t address = reg[base].I & 0xFFFFFFFC;
2248 2246
 	int count = 0;
2249
-	uint32_t temp = reg[base].I + 4 * (cpuBitsSet[opcode & 0xFF] + cpuBitsSet[(opcode >> 8) & 255]);
2250 2247
 	STMW_ALL;
2251 2248
 	clockTicks += 1 + codeTicksAccess32(armNextPC);
2252 2249
 }
... ...
@@ -2297,9 +2294,9 @@ static INSN_REGPARM void arm8E0(uint32_t opcode)
2297 2294
 	if (!busPrefetchCount)
2298 2295
 		busPrefetch = busPrefetchEnable;
2299 2296
 	int base = (opcode & 0x000F0000) >> 16;
2297
+	uint32_t temp = reg[base].I + 4 * (cpuBitsSet[opcode & 0xFF] + cpuBitsSet[(opcode >> 8) & 255]);
2300 2298
 	uint32_t address = reg[base].I & 0xFFFFFFFC;
2301 2299
 	int count = 0;
2302
-	uint32_t temp = reg[base].I + 4 * (cpuBitsSet[opcode & 0xFF] + cpuBitsSet[(opcode >> 8) & 255]);
2303 2300
 	STMW_ALL_2;
2304 2301
 	clockTicks += 1 + codeTicksAccess32(armNextPC);
2305 2302
 }
... ...
@@ -2460,9 +2457,9 @@ static INSN_REGPARM void arm9A0(uint32_t opcode)
2460 2457
 	if (!busPrefetchCount)
2461 2458
 		busPrefetch = busPrefetchEnable;
2462 2459
 	int base = (opcode & 0x000F0000) >> 16;
2460
+	uint32_t temp = reg[base].I + 4 * (cpuBitsSet[opcode & 0xFF] + cpuBitsSet[(opcode >> 8) & 255]);
2463 2461
 	uint32_t address = (reg[base].I + 4) & 0xFFFFFFFC;
2464 2462
 	int count = 0;
2465
-	uint32_t temp = reg[base].I + 4 * (cpuBitsSet[opcode & 0xFF] + cpuBitsSet[(opcode >> 8) & 255]);
2466 2463
 	STMW_ALL;
2467 2464
 	clockTicks += 1 + codeTicksAccess32(armNextPC);
2468 2465
 }
... ...
@@ -2513,9 +2510,9 @@ static INSN_REGPARM void arm9E0(uint32_t opcode)
2513 2510
 	if (!busPrefetchCount)
2514 2511
 		busPrefetch = busPrefetchEnable;
2515 2512
 	int base = (opcode & 0x000F0000) >> 16;
2513
+	uint32_t temp = reg[base].I + 4 * (cpuBitsSet[opcode & 0xFF] + cpuBitsSet[(opcode >> 8) & 255]);
2516 2514
 	uint32_t address = (reg[base].I + 4) & 0xFFFFFFFC;
2517 2515
 	int count = 0;
2518
-	uint32_t temp = reg[base].I + 4 * (cpuBitsSet[opcode & 0xFF] + cpuBitsSet[(opcode >> 8) & 255]);
2519 2516
 	STMW_ALL_2;
2520 2517
 	clockTicks += 1 + codeTicksAccess32(armNextPC);
2521 2518
 }
... ...
@@ -2565,7 +2562,7 @@ static INSN_REGPARM void armB00(uint32_t opcode)
2565 2562
 	reg[15].I += 4;
2566 2563
 	ARM_PREFETCH();
2567 2564
 	clockTicks = codeTicksAccessSeq32(armNextPC) + 1;
2568
-	clockTicks += 2 + codeTicksAccess32(armNextPC) + codeTicksAccessSeq32(armNextPC);
2565
+	clockTicks = (clockTicks * 2) + codeTicksAccess32(armNextPC) + 1;
2569 2566
 	busPrefetchCount = 0;
2570 2567
 }
2571 2568
 
... ...
@@ -2846,7 +2843,6 @@ int armExecute()
2846 2843
 				case 0x0E: // AL (impossible, checked above)
2847 2844
 					cond_res = true;
2848 2845
 					break;
2849
-				case 0x0F:
2850 2846
 				default:
2851 2847
 					// ???
2852 2848
 					cond_res = false;
Browse code

[GSF] Massive code cleanup.

(As an aside, blargg's code style makes me go blarg myself.)

Naram Qashat authored on 2013/05/14 01:07:18
Showing 1 changed files
... ...
@@ -1,34 +1,16 @@
1
-#include <stdio.h>
2
-#include <stdlib.h>
3
-#include <memory.h>
4
-#include <stdarg.h>
5
-#include <string.h>
6
-
7 1
 #include "GBA.h"
8 2
 #include "GBAcpu.h"
9 3
 #include "GBAinline.h"
10 4
 #include "Globals.h"
11
-//#include "EEprom.h"
12
-//#include "Flash.h"
13 5
 #include "Sound.h"
14
-//#include "Sram.h"
15 6
 #include "bios.h"
16
-//#include "Cheats.h"
17
-//#include "../NLS.h"
18
-//#include "elf.h"
19
-//#include "../Util.h"
20
-//#include "../System.h"
21
-//#include "agbprint.h"
22
-#ifdef PROFILING
23
-#include "prof/prof.h"
24
-#endif
25 7
 
26 8
 #ifdef _MSC_VER
27
- // Disable "empty statement" warnings
28
- #pragma warning(disable: 4390)
29
- // Visual C's inline assembler treats "offset" as a reserved word, so we
30
- // tell it otherwise.  If you want to use it, write "OFFSET" in capitals.
31
- #define offset offset_
9
+// Disable "empty statement" warnings
10
+# pragma warning(disable: 4390)
11
+// Visual C's inline assembler treats "offset" as a reserved word, so we
12
+// tell it otherwise.  If you want to use it, write "OFFSET" in capitals.
13
+# define offset offset_
32 14
 #endif
33 15
 
34 16
 ///////////////////////////////////////////////////////////////////////////
... ...
@@ -37,77 +19,13 @@ static int clockTicks;
37 19
 
38 20
 static INSN_REGPARM void armUnknownInsn(uint32_t opcode)
39 21
 {
40
-#ifdef GBA_LOGGING
41
-    if (systemVerbose & VERBOSE_UNDEFINED) {
42
-        log("Undefined ARM instruction %08x at %08x\n", opcode,
43
-            armNextPC-4);
44
-    }
45
-#endif
46
-    CPUUndefinedException();
47
-}
48
-
49
-#ifdef BKPT_SUPPORT
50
-static INSN_REGPARM void armBreakpoint(uint32_t opcode)
51
-{
52
-    reg[15].I -= 4;
53
-    armNextPC -= 4;
54
-    dbgSignal(5, (opcode & 0x0f) | ((opcode>>4) & 0xfff0));
55
-    clockTicks = -1;
22
+	CPUUndefinedException();
56 23
 }
57
-#endif
58
-
59
-
60
-// Subroutine to count instructions (for debugging/optimizing)
61
-//#define INSN_COUNTER  // comment out if you don't want it
62
-#ifdef INSN_COUNTER
63
-static void count(uint32_t opcode, int cond_res)
64
-{
65
-    static int insncount = 0;    // number of insns seen
66
-    static int executed = 0;     // number of insns executed
67
-    static int mergewith[4096];  // map instructions to routines
68
-    static int count[4096];      // count of each 12-bit code
69
-    int index = ((opcode>>16)&0xFF0) | ((opcode>>4)&0x0F);
70
-    static FILE *outfile = NULL;
71
-
72
-    if (!insncount) {
73
-        for (int i = 0; i < 4096; i++) {
74
-            for (int j = 0; j < i; j++) {
75
-                if (armInsnTable[i] == armInsnTable[j])
76
-                    break;
77
-            }
78
-            mergewith[i] = j;
79
-        }
80
-        outfile = fopen("VBA-armcount.txt", "w");
81
-    }
82
-    if (cond_res) {
83
-        count[mergewith[index]]++;
84
-        executed++;
85
-    }
86
-    insncount++;
87
-    if (outfile && insncount%1000000 == 0) {
88
-        fprintf(outfile, "Total instructions: %d\n", insncount);
89
-        fprintf(outfile, "Instructions executed: %d\n", executed);
90
-        for (int i = 0; i < 4096; i++) {
91
-            if (count[i])
92
-                fprintf(outfile, "arm%03X: %d\n", i, count[i]);
93
-        }
94
-    }
95
-}
96
-#endif
97 24
 
98 25
 // Common macros //////////////////////////////////////////////////////////
99 26
 
100
-#ifdef BKPT_SUPPORT
101
-#define CONSOLE_OUTPUT(a,b) do { \
102
-    if ((opcode == 0xe0000000) && (reg[0].I == 0xC0DED00D)) {   \
103
-        dbgOutput((a), (b));                                    \
104
-} while (0)
105
-#else
106
-#define CONSOLE_OUTPUT(a,b)  /* nothing */
107
-#endif
108
-
109
-#define NEG(i) ((i) >> 31)
110
-#define POS(i) ((~(i)) >> 31)
27
+static inline uint32_t NEG(uint32_t i) { return i >> 31; }
28
+static inline uint32_t POS(uint32_t i) { return ~i >> 31; }
111 29
 
112 30
 // The following macros are used for optimization; any not defined for a
113 31
 // particular compiler/CPU combination default to the C core versions.
... ...
@@ -135,210 +53,207 @@ static void count(uint32_t opcode, int cond_res)
135 53
 //                STR instructions.
136 54
 
137 55
 #ifndef C_CORE
138
-
139
-#if 0  // definitions have changed
56
+# if 0  // definitions have changed
140 57
 //#ifdef __POWERPC__
141
-            #define OP_SUBS \
142
-            {\
143
-                register int Flags;                             \
144
-                register int Result;                            \
145
-                asm volatile("subco. %0, %2, %3\n"              \
146
-                            "mcrxr cr1\n"                       \
147
-                            "mfcr %1\n"                         \
148
-                            : "=r" (Result),                    \
149
-                              "=r" (Flags)                      \
150
-                            : "r" (reg[base].I),                \
151
-                              "r" (value)                       \
152
-                            );                                  \
153
-                reg[dest].I = Result;                           \
154
-                Z_FLAG = (Flags >> 29) & 1;                     \
155
-                N_FLAG = (Flags >> 31) & 1;                     \
156
-                C_FLAG = (Flags >> 25) & 1;                     \
157
-                V_FLAG = (Flags >> 26) & 1;                     \
158
-            }
159
-            #define OP_RSBS \
160
-            {\
161
-                register int Flags;                             \
162
-                register int Result;                            \
163
-                asm volatile("subfco. %0, %2, %3\n"             \
164
-                            "mcrxr cr1\n"                       \
165
-                            "mfcr %1\n"                         \
166
-                            : "=r" (Result),                    \
167
-                              "=r" (Flags)                      \
168
-                            : "r" (reg[base].I),                \
169
-                              "r" (value)                       \
170
-                            );                                  \
171
-                reg[dest].I = Result;                           \
172
-                Z_FLAG = (Flags >> 29) & 1;                     \
173
-                N_FLAG = (Flags >> 31) & 1;                     \
174
-                C_FLAG = (Flags >> 25) & 1;                     \
175
-                V_FLAG = (Flags >> 26) & 1;                     \
176
-            }
177
-            #define OP_ADDS \
178
-            {\
179
-                register int Flags;                             \
180
-                register int Result;                            \
181
-                asm volatile("addco. %0, %2, %3\n"              \
182
-                            "mcrxr cr1\n"                       \
183
-                            "mfcr %1\n"                         \
184
-                            : "=r" (Result),                    \
185
-                              "=r" (Flags)                      \
186
-                            : "r" (reg[base].I),                \
187
-                              "r" (value)                       \
188
-                            );                                  \
189
-                reg[dest].I = Result;                           \
190
-                Z_FLAG = (Flags >> 29) & 1;                     \
191
-                N_FLAG = (Flags >> 31) & 1;                     \
192
-                C_FLAG = (Flags >> 25) & 1;                     \
193
-                V_FLAG = (Flags >> 26) & 1;                     \
194
-            }
195
-            #define OP_ADCS \
196
-            {\
197
-                register int Flags;                             \
198
-                register int Result;                            \
199
-                asm volatile("mtspr xer, %4\n"                  \
200
-                             "addeo. %0, %2, %3\n"              \
201
-                             "mcrxr cr1\n"                      \
202
-                             "mfcr      %1\n"                   \
203
-                             : "=r" (Result),                   \
204
-                               "=r" (Flags)                     \
205
-                             : "r" (reg[base].I),               \
206
-                               "r" (value),                     \
207
-                               "r" (C_FLAG << 29)               \
208
-                             );                                 \
209
-                reg[dest].I = Result;                           \
210
-                Z_FLAG = (Flags >> 29) & 1;                     \
211
-                N_FLAG = (Flags >> 31) & 1;                     \
212
-                C_FLAG = (Flags >> 25) & 1;                     \
213
-                V_FLAG = (Flags >> 26) & 1;                     \
214
-            }
215
-            #define OP_SBCS \
216
-            {\
217
-                register int Flags;                             \
218
-                register int Result;                            \
219
-                asm volatile("mtspr xer, %4\n"                  \
220
-                             "subfeo. %0, %3, %2\n"             \
221
-                             "mcrxr cr1\n"                      \
222
-                             "mfcr      %1\n"                   \
223
-                             : "=r" (Result),                   \
224
-                               "=r" (Flags)                     \
225
-                             : "r" (reg[base].I),               \
226
-                               "r" (value),                     \
227
-                               "r" (C_FLAG << 29)               \
228
-                             );                                 \
229
-                reg[dest].I = Result;                           \
230
-                Z_FLAG = (Flags >> 29) & 1;                     \
231
-                N_FLAG = (Flags >> 31) & 1;                     \
232
-                C_FLAG = (Flags >> 25) & 1;                     \
233
-                V_FLAG = (Flags >> 26) & 1;                     \
234
-            }
235
-            #define OP_RSCS \
236
-            {\
237
-                register int Flags;                             \
238
-                register int Result;                            \
239
-                asm volatile("mtspr xer, %4\n"                  \
240
-                             "subfeo. %0, %2, %3\n"             \
241
-                             "mcrxr cr1\n"                      \
242
-                             "mfcr      %1\n"                   \
243
-                             : "=r" (Result),                   \
244
-                               "=r" (Flags)                     \
245
-                             : "r" (reg[base].I),               \
246
-                               "r" (value),                     \
247
-                               "r" (C_FLAG << 29)               \
248
-                             );                                 \
249
-                reg[dest].I = Result;                           \
250
-                Z_FLAG = (Flags >> 29) & 1;                     \
251
-                N_FLAG = (Flags >> 31) & 1;                     \
252
-                C_FLAG = (Flags >> 25) & 1;                     \
253
-                V_FLAG = (Flags >> 26) & 1;                     \
254
-            }
255
-            #define OP_CMP \
256
-            {\
257
-                register int Flags;                             \
258
-                register int Result;                            \
259
-                asm volatile("subco. %0, %2, %3\n"              \
260
-                            "mcrxr cr1\n"                       \
261
-                            "mfcr %1\n"                         \
262
-                            : "=r" (Result),                    \
263
-                              "=r" (Flags)                      \
264
-                            : "r" (reg[base].I),                \
265
-                              "r" (value)                       \
266
-                            );                                  \
267
-                Z_FLAG = (Flags >> 29) & 1;                     \
268
-                N_FLAG = (Flags >> 31) & 1;                     \
269
-                C_FLAG = (Flags >> 25) & 1;                     \
270
-                V_FLAG = (Flags >> 26) & 1;                     \
271
-            }
272
-            #define OP_CMN \
273
-            {\
274
-                register int Flags;                             \
275
-                register int Result;                            \
276
-                asm volatile("addco. %0, %2, %3\n"              \
277
-                            "mcrxr cr1\n"                       \
278
-                            "mfcr %1\n"                         \
279
-                            : "=r" (Result),                    \
280
-                              "=r" (Flags)                      \
281
-                            : "r" (reg[base].I),                \
282
-                              "r" (value)                       \
283
-                            );                                  \
284
-                Z_FLAG = (Flags >> 29) & 1;                     \
285
-                N_FLAG = (Flags >> 31) & 1;                     \
286
-                C_FLAG = (Flags >> 25) & 1;                     \
287
-                V_FLAG = (Flags >> 26) & 1;                     \
288
-            }
289
-
290
-#else  // !__POWERPC__
291
-
58
+#  define OP_SUBS \
59
+{ \
60
+	register int Flags; \
61
+	register int Result; \
62
+	asm volatile("subco. %0, %2, %3\n" \
63
+		"mcrxr cr1\n" \
64
+		"mfcr %1\n" \
65
+		: "=r" (Result), \
66
+		"=r" (Flags) \
67
+		: "r" (reg[base].I), \
68
+		"r" (value) \
69
+		); \
70
+	reg[dest].I = Result; \
71
+	Z_FLAG = (Flags >> 29) & 1; \
72
+	N_FLAG = (Flags >> 31) & 1; \
73
+	C_FLAG = (Flags >> 25) & 1; \
74
+	V_FLAG = (Flags >> 26) & 1; \
75
+}
76
+#  define OP_RSBS \
77
+{ \
78
+	register int Flags; \
79
+	register int Result; \
80
+	asm volatile("subfco. %0, %2, %3\n" \
81
+		"mcrxr cr1\n" \
82
+		"mfcr %1\n" \
83
+		: "=r" (Result), \
84
+		"=r" (Flags) \
85
+		: "r" (reg[base].I), \
86
+		"r" (value) \
87
+		); \
88
+	reg[dest].I = Result; \
89
+	Z_FLAG = (Flags >> 29) & 1; \
90
+	N_FLAG = (Flags >> 31) & 1; \
91
+	C_FLAG = (Flags >> 25) & 1; \
92
+	V_FLAG = (Flags >> 26) & 1; \
93
+}
94
+#  define OP_ADDS \
95
+{ \
96
+	register int Flags; \
97
+	register int Result; \
98
+	asm volatile("addco. %0, %2, %3\n" \
99
+		"mcrxr cr1\n" \
100
+		"mfcr %1\n" \
101
+		: "=r" (Result), \
102
+		"=r" (Flags) \
103
+		: "r" (reg[base].I), \
104
+		"r" (value) \
105
+		); \
106
+	reg[dest].I = Result; \
107
+	Z_FLAG = (Flags >> 29) & 1; \
108
+	N_FLAG = (Flags >> 31) & 1; \
109
+	C_FLAG = (Flags >> 25) & 1; \
110
+	V_FLAG = (Flags >> 26) & 1; \
111
+}
112
+#  define OP_ADCS \
113
+{ \
114
+	register int Flags; \
115
+	register int Result; \
116
+	asm volatile("mtspr xer, %4\n" \
117
+		"addeo. %0, %2, %3\n" \
118
+		"mcrxr cr1\n" \
119
+		"mfcr %1\n" \
120
+		: "=r" (Result), \
121
+		"=r" (Flags) \
122
+		: "r" (reg[base].I), \
123
+		"r" (value), \
124
+		"r" (C_FLAG << 29) \
125
+		); \
126
+	reg[dest].I = Result; \
127
+	Z_FLAG = (Flags >> 29) & 1; \
128
+	N_FLAG = (Flags >> 31) & 1; \
129
+	C_FLAG = (Flags >> 25) & 1; \
130
+	V_FLAG = (Flags >> 26) & 1; \
131
+}
132
+#  define OP_SBCS \
133
+{ \
134
+	register int Flags; \
135
+	register int Result; \
136
+	asm volatile("mtspr xer, %4\n" \
137
+		"subfeo. %0, %3, %2\n" \
138
+		"mcrxr cr1\n" \
139
+		"mfcr %1\n" \
140
+		: "=r" (Result), \
141
+		"=r" (Flags) \
142
+		: "r" (reg[base].I), \
143
+		"r" (value), \
144
+		"r" (C_FLAG << 29) \
145
+		); \
146
+	reg[dest].I = Result; \
147
+	Z_FLAG = (Flags >> 29) & 1; \
148
+	N_FLAG = (Flags >> 31) & 1; \
149
+	C_FLAG = (Flags >> 25) & 1; \
150
+	V_FLAG = (Flags >> 26) & 1; \
151
+}
152
+#  define OP_RSCS \
153
+{ \
154
+	register int Flags; \
155
+	register int Result; \
156
+	asm volatile("mtspr xer, %4\n"\
157
+		"subfeo. %0, %2, %3\n" \
158
+		"mcrxr cr1\n" \
159
+		"mfcr %1\n" \
160
+		: "=r" (Result), \
161
+		"=r" (Flags) \
162
+		: "r" (reg[base].I), \
163
+		"r" (value), \
164
+		"r" (C_FLAG << 29) \
165
+		); \
166
+	reg[dest].I = Result; \
167
+	Z_FLAG = (Flags >> 29) & 1; \
168
+	N_FLAG = (Flags >> 31) & 1; \
169
+	C_FLAG = (Flags >> 25) & 1; \
170
+	V_FLAG = (Flags >> 26) & 1; \
171
+}
172
+#  define OP_CMP \
173
+{ \
174
+	register int Flags; \
175
+	register int Result; \
176
+	asm volatile("subco. %0, %2, %3\n" \
177
+		"mcrxr cr1\n" \
178
+		"mfcr %1\n" \
179
+		: "=r" (Result), \
180
+		"=r" (Flags) \
181
+		: "r" (reg[base].I), \
182
+		"r" (value) \
183
+		); \
184
+	Z_FLAG = (Flags >> 29) & 1; \
185
+	N_FLAG = (Flags >> 31) & 1; \
186
+	C_FLAG = (Flags >> 25) & 1; \
187
+	V_FLAG = (Flags >> 26) & 1; \
188
+}
189
+#  define OP_CMN \
190
+{ \
191
+	register int Flags; \
192
+	register int Result; \
193
+	asm volatile("addco. %0, %2, %3\n" \
194
+		"mcrxr cr1\n" \
195
+		"mfcr %1\n" \
196
+		: "=r" (Result), \
197
+		"=r" (Flags) \
198
+		: "r" (reg[base].I), \
199
+		"r" (value) \
200
+		); \
201
+	Z_FLAG = (Flags >> 29) & 1; \
202
+	N_FLAG = (Flags >> 31) & 1; \
203
+	C_FLAG = (Flags >> 25) & 1; \
204
+	V_FLAG = (Flags >> 26) & 1; \
205
+}
206
+# else  // !__POWERPC__
292 207
 // Macros to emit instructions in the format used by the particular compiler.
293 208
 // We use GNU assembler syntax: "op src, dest" rather than "op dest, src"
294 209
 
295
-#ifdef __GNUC__
296
- #define ALU_HEADER           asm("mov %%ecx, %%edi; "
297
- #define ALU_TRAILER          : "=D" (opcode) : "c" (opcode) : "eax", "ebx", "edx", "esi")
298
- #define EMIT0(op)            #op"; "
299
- #define EMIT1(op,arg)        #op" "arg"; "
300
- #define EMIT2(op,src,dest)   #op" "src", "dest"; "
301
- #define KONST(val)           "$"#val
302
- #define ASMVAR(cvar)         ASMVAR2 (__USER_LABEL_PREFIX__, cvar)
303
- #define ASMVAR2(prefix,cvar) STRING (prefix) cvar
304
- #define STRING(x)            #x
305
- #define VAR(var)             ASMVAR(#var)
306
- #define VARL(var)            ASMVAR(#var)
307
- #define REGREF1(index)       ASMVAR("reg("index")")
308
- #define REGREF2(index,scale) ASMVAR("reg(,"index","#scale")")
309
- #define LABEL(n)             #n": "
310
- #define LABELREF(n,dir)      #n#dir
311
- #define al "%%al"
312
- #define ah "%%ah"
313
- #define eax "%%eax"
314
- #define bl "%%bl"
315
- #define bh "%%bh"
316
- #define ebx "%%ebx"
317
- #define cl "%%cl"
318
- #define ch "%%ch"
319
- #define ecx "%%ecx"
320
- #define dl "%%dl"
321
- #define dh "%%dh"
322
- #define edx "%%edx"
323
- #define esp "%%esp"
324
- #define ebp "%%ebp"
325
- #define esi "%%esi"
326
- #define edi "%%edi"
327
- #define movzx movzb
210
+#  ifdef __GNUC__
211
+#   define ALU_HEADER asm("mov %%ecx, %%edi; "
212
+#   define ALU_TRAILER : "=D" (opcode) : "c" (opcode) : "eax", "ebx", "edx", "esi")
213
+#   define EMIT0(op) #op "; "
214
+#   define EMIT1(op, arg) #op " " arg "; "
215
+#   define EMIT2(op, src, dest) #op " " src ", " dest "; "
216
+#   define KONST(val) "$" #val
217
+#   define ASMVAR(cvar) ASMVAR2(__USER_LABEL_PREFIX__, cvar)
218
+#   define ASMVAR2(prefix, cvar) STRING(prefix) cvar
219
+#   define STRING(x) #x
220
+#   define VAR(var) ASMVAR(#var)
221
+#   define VARL(var) ASMVAR(#var)
222
+#   define REGREF1(index) ASMVAR("reg(" index ")")
223
+#   define REGREF2(index, scale) ASMVAR("reg(," index "," #scale ")")
224
+#   define LABEL(n) #n ": "
225
+#   define LABELREF(n, dir) #n#dir
226
+#   define al "%%al"
227
+#   define ah "%%ah"
228
+#   define eax "%%eax"
229
+#   define bl "%%bl"
230
+#   define bh "%%bh"
231
+#   define ebx "%%ebx"
232
+#   define cl "%%cl"
233
+#   define ch "%%ch"
234
+#   define ecx "%%ecx"
235
+#   define dl "%%dl"
236
+#   define dh "%%dh"
237
+#   define edx "%%edx"
238
+#   define esp "%%esp"
239
+#   define ebp "%%ebp"
240
+#   define esi "%%esi"
241
+#   define edi "%%edi"
242
+#   define movzx movzb
328 243
 #else
329
- #define ALU_HEADER           __asm { __asm mov ecx, opcode
330
- #define ALU_TRAILER          }
331
- #define EMIT0(op)            __asm op
332
- #define EMIT1(op,arg)        __asm op arg
333
- #define EMIT2(op,src,dest)   __asm op dest, src
334
- #define KONST(val)           val
335
- #define VAR(var)             var
336
- #define VARL(var)            dword ptr var
337
- #define REGREF1(index)       reg[index]
338
- #define REGREF2(index,scale) reg[index*scale]
339
- #define LABEL(n)             __asm l##n:
340
- #define LABELREF(n,dir)      l##n
341
-#endif
244
+#   define ALU_HEADER __asm { __asm mov ecx, opcode
245
+#   define ALU_TRAILER }
246
+#   define EMIT0(op) __asm op
247
+#   define EMIT1(op,arg) __asm op arg
248
+#   define EMIT2(op, src, dest) __asm op dest, src
249
+#   define KONST(val) val
250
+#   define VAR(var) var
251
+#   define VARL(var) dword ptr var
252
+#   define REGREF1(index) reg[index]
253
+#   define REGREF2(index, scale) reg[index * scale]
254
+#   define LABEL(n) __asm l##n:
255
+#   define LABELREF(n, dir) l##n
256
+#  endif
342 257
 
343 258
 //X//#ifndef _MSC_VER
344 259
 // ALU op register usage:
... ...
@@ -349,763 +264,783 @@ static void count(uint32_t opcode, int cond_res)
349 264
 //    ESI -> Rd (destination) index * 4
350 265
 
351 266
 // Helper macros for loading value / shift count
352
-#define VALUE_LOAD_IMM \
353
-        EMIT2(and, KONST(0x0F), eax)            \
354
-        EMIT2(mov, REGREF2(eax,4), eax)         \
355
-        EMIT2(shr, KONST(7), ecx)               \
356
-        EMIT2(and, KONST(0x1F), ecx)
357
-#define VALUE_LOAD_REG \
358
-        EMIT2(and, KONST(0x0F), eax)            \
359
-                EMIT2(cmp, KONST(0x0F), eax)                    \
360
-        EMIT2(mov, REGREF2(eax,4), eax)         \
361
-                EMIT1(jne, LABELREF(3,f))                               \
362
-                EMIT2(add, KONST(4), eax)                               \
363
-                LABEL(3)                                                                \
364
-        EMIT2(movzx, ch, ecx)                   \
365
-        EMIT2(and, KONST(0x0F), ecx)            \
366
-        EMIT2(mov, REGREF2(ecx,4), ecx)
267
+#  define VALUE_LOAD_IMM \
268
+	EMIT2(and, KONST(0x0F), eax) \
269
+	EMIT2(mov, REGREF2(eax, 4), eax) \
270
+	EMIT2(shr, KONST(7), ecx) \
271
+	EMIT2(and, KONST(0x1F), ecx)
272
+#  define VALUE_LOAD_REG \
273
+	EMIT2(and, KONST(0x0F), eax) \
274
+	EMIT2(cmp, KONST(0x0F), eax) \
275
+	EMIT2(mov, REGREF2(eax, 4), eax) \
276
+	EMIT1(jne, LABELREF(3, f)) \
277
+	EMIT2(add, KONST(4), eax) \
278
+	LABEL(3) \
279
+	EMIT2(movzx, ch, ecx) \
280
+	EMIT2(and, KONST(0x0F), ecx) \
281
+	EMIT2(mov, REGREF2(ecx, 4), ecx)
367 282
 
368 283
 // Helper macros for setting flags
369
-#define SETCOND_LOGICAL \
370
-    EMIT1(sets, VAR(N_FLAG))            \
371
-    EMIT1(setz, VAR(Z_FLAG))            \
372
-    EMIT2(mov, bl, VAR(C_FLAG))
373
-#define SETCOND_ADD \
374
-    EMIT1(sets, VAR(N_FLAG))            \
375
-    EMIT1(setz, VAR(Z_FLAG))            \
376
-    EMIT1(seto, VAR(V_FLAG))            \
377
-    EMIT1(setc, VAR(C_FLAG))
378
-#define SETCOND_SUB \
379
-    EMIT1(sets, VAR(N_FLAG))            \
380
-    EMIT1(setz, VAR(Z_FLAG))            \
381
-    EMIT1(seto, VAR(V_FLAG))            \
382
-    EMIT1(setnc, VAR(C_FLAG))
284
+#  define SETCOND_LOGICAL \
285
+	EMIT1(sets, VAR(N_FLAG)) \
286
+	EMIT1(setz, VAR(Z_FLAG)) \
287
+	EMIT2(mov, bl, VAR(C_FLAG))
288
+#  define SETCOND_ADD \
289
+	EMIT1(sets, VAR(N_FLAG)) \
290
+	EMIT1(setz, VAR(Z_FLAG)) \
291
+	EMIT1(seto, VAR(V_FLAG)) \
292
+	EMIT1(setc, VAR(C_FLAG))
293
+#  define SETCOND_SUB \
294
+	EMIT1(sets, VAR(N_FLAG)) \
295
+	EMIT1(setz, VAR(Z_FLAG)) \
296
+	EMIT1(seto, VAR(V_FLAG)) \
297
+	EMIT1(setnc, VAR(C_FLAG))
383 298
 
384 299
 // ALU initialization
385
-#define ALU_INIT(LOAD_C_FLAG) \
386
-    ALU_HEADER                          \
387
-    LOAD_C_FLAG                         \
388
-    EMIT2(mov, ecx, edx)                \
389
-    EMIT2(shr, KONST(14), edx)          \
390
-    EMIT2(mov, ecx, eax)                \
391
-    EMIT2(mov, ecx, esi)                \
392
-    EMIT2(shr, KONST(10), esi)          \
393
-    EMIT2(and, KONST(0x3C), edx)        \
394
-    EMIT2(mov, REGREF1(edx), edx)       \
395
-    EMIT2(and, KONST(0x3C), esi)
396
-
397
-#define LOAD_C_FLAG_YES EMIT2(mov, VAR(C_FLAG), bl)
398
-#define LOAD_C_FLAG_NO  /*nothing*/
399
-#define ALU_INIT_C ALU_INIT(LOAD_C_FLAG_YES)
400
-#define ALU_INIT_NC ALU_INIT(LOAD_C_FLAG_NO)
300
+#  define ALU_INIT(LOAD_C_FLAG) \
301
+	ALU_HEADER \
302
+	LOAD_C_FLAG \
303
+	EMIT2(mov, ecx, edx) \
304
+	EMIT2(shr, KONST(14), edx) \
305
+	EMIT2(mov, ecx, eax) \
306
+	EMIT2(mov, ecx, esi) \
307
+	EMIT2(shr, KONST(10), esi) \
308
+	EMIT2(and, KONST(0x3C), edx) \
309
+	EMIT2(mov, REGREF1(edx), edx) \
310
+	EMIT2(and, KONST(0x3C), esi)
311
+
312
+#  define LOAD_C_FLAG_YES EMIT2(mov, VAR(C_FLAG), bl)
313
+#  define LOAD_C_FLAG_NO  /*nothing*/
314
+#  define ALU_INIT_C ALU_INIT(LOAD_C_FLAG_YES)
315
+#  define ALU_INIT_NC ALU_INIT(LOAD_C_FLAG_NO)
401 316
 
402 317
 // Macros to load the value operand for an ALU op; these all set N/Z
403 318
 // according to the value
404 319
 
405 320
 // OP Rd,Rb,Rm LSL #
406
-#define VALUE_LSL_IMM_C \
407
-    VALUE_LOAD_IMM                      \
408
-    EMIT1(jnz, LABELREF(1,f))           \
409
-    EMIT1(jmp, LABELREF(0,f))           \
410
-    LABEL(1)                            \
411
-    EMIT2(shl, cl, eax)                 \
412
-    EMIT1(setc, bl)                     \
413
-    LABEL(0)
414
-#define VALUE_LSL_IMM_NC \
415
-    VALUE_LOAD_IMM                      \
416
-    EMIT2(shl, cl, eax)
321
+#  define VALUE_LSL_IMM_C \
322
+	VALUE_LOAD_IMM \
323
+	EMIT1(jnz, LABELREF(1, f)) \
324
+	EMIT1(jmp, LABELREF(0, f)) \
325
+	LABEL(1) \
326
+	EMIT2(shl, cl, eax) \
327
+	EMIT1(setc, bl) \
328
+	LABEL(0)
329
+#  define VALUE_LSL_IMM_NC \
330
+	VALUE_LOAD_IMM \
331
+	EMIT2(shl, cl, eax)
417 332
 
418 333
 // OP Rd,Rb,Rm LSL Rs
419
-#define VALUE_LSL_REG_C \
420
-    VALUE_LOAD_REG                      \
421
-    EMIT2(test, cl, cl)                 \
422
-    EMIT1(jz, LABELREF(0,f))            \
423
-    EMIT2(cmp, KONST(0x20), cl)         \
424
-    EMIT1(je, LABELREF(1,f))            \
425
-    EMIT1(ja, LABELREF(2,f))            \
426
-    EMIT2(shl, cl, eax)                 \
427
-    EMIT1(setc, bl)                     \
428
-    EMIT1(jmp, LABELREF(0,f))           \
429
-    LABEL(1)                            \
430
-    EMIT2(test, KONST(1), al)           \
431
-    EMIT1(setnz, bl)                    \
432
-    EMIT2(xor, eax, eax)                \
433
-    EMIT1(jmp, LABELREF(0,f))           \
434
-    LABEL(2)                            \
435
-    EMIT2(xor, ebx, ebx)                \
436
-    EMIT2(xor, eax, eax)                \
437
-    LABEL(0)
438
-#define VALUE_LSL_REG_NC \
439
-    VALUE_LOAD_REG                      \
440
-    EMIT2(cmp, KONST(0x20), cl)         \
441
-    EMIT1(jae, LABELREF(1,f))           \
442
-    EMIT2(shl, cl, eax)                 \
443
-    EMIT1(jmp, LABELREF(0,f))           \
444
-    LABEL(1)                            \
445
-    EMIT2(xor, eax, eax)                \
446
-    LABEL(0)
334
+#  define VALUE_LSL_REG_C \
335
+	VALUE_LOAD_REG \
336
+	EMIT2(test, cl, cl) \
337
+	EMIT1(jz, LABELREF(0, f)) \
338
+	EMIT2(cmp, KONST(0x20), cl) \
339
+	EMIT1(je, LABELREF(1, f)) \
340
+	EMIT1(ja, LABELREF(2, f)) \
341
+	EMIT2(shl, cl, eax) \
342
+	EMIT1(setc, bl) \
343
+	EMIT1(jmp, LABELREF(0, f)) \
344
+	LABEL(1) \
345
+	EMIT2(test, KONST(1), al) \
346
+	EMIT1(setnz, bl) \
347
+	EMIT2(xor, eax, eax) \
348
+	EMIT1(jmp, LABELREF(0, f)) \
349
+	LABEL(2) \
350
+	EMIT2(xor, ebx, ebx) \
351
+	EMIT2(xor, eax, eax) \
352
+	LABEL(0)
353
+#  define VALUE_LSL_REG_NC \
354
+	VALUE_LOAD_REG \
355
+	EMIT2(cmp, KONST(0x20), cl) \
356
+	EMIT1(jae, LABELREF(1, f)) \
357
+	EMIT2(shl, cl, eax) \
358
+	EMIT1(jmp, LABELREF(0, f)) \
359
+	LABEL(1) \
360
+	EMIT2(xor, eax, eax) \
361
+	LABEL(0)
447 362
 
448 363
 // OP Rd,Rb,Rm LSR #
449
-#define VALUE_LSR_IMM_C \
450
-    VALUE_LOAD_IMM                      \
451
-    EMIT1(jz, LABELREF(1,f))            \
452
-    EMIT2(shr, cl, eax)                 \
453
-    EMIT1(setc, bl)                     \
454
-    EMIT1(jmp, LABELREF(0,f))           \
455
-    LABEL(1)                            \
456
-    EMIT2(test, eax, eax)               \
457
-    EMIT1(sets, bl)                     \
458
-    EMIT2(xor, eax, eax)                \
459
-    LABEL(0)
460
-#define VALUE_LSR_IMM_NC \
461
-    VALUE_LOAD_IMM                      \
462
-    EMIT1(jz, LABELREF(1,f))            \
463
-    EMIT2(shr, cl, eax)                 \
464
-    EMIT1(jmp, LABELREF(0,f))           \
465
-    LABEL(1)                            \
466
-    EMIT2(xor, eax, eax)                \
467
-    LABEL(0)
364
+#  define VALUE_LSR_IMM_C \
365
+	VALUE_LOAD_IMM \
366
+	EMIT1(jz, LABELREF(1, f)) \
367
+	EMIT2(shr, cl, eax) \
368
+	EMIT1(setc, bl) \
369
+	EMIT1(jmp, LABELREF(0, f)) \
370
+	LABEL(1) \
371
+	EMIT2(test, eax, eax) \
372
+	EMIT1(sets, bl) \
373
+	EMIT2(xor, eax, eax) \
374
+	LABEL(0)
375
+#  define VALUE_LSR_IMM_NC \
376
+	VALUE_LOAD_IMM \
377
+	EMIT1(jz, LABELREF(1, f)) \
378
+	EMIT2(shr, cl, eax) \
379
+	EMIT1(jmp, LABELREF(0, f)) \
380
+	LABEL(1) \
381
+	EMIT2(xor, eax, eax) \
382
+	LABEL(0)
468 383
 
469 384
 // OP Rd,Rb,Rm LSR Rs
470
-#define VALUE_LSR_REG_C \
471
-    VALUE_LOAD_REG                      \
472
-    EMIT2(test, cl, cl)                 \
473
-    EMIT1(jz, LABELREF(0,f))            \
474
-    EMIT2(cmp, KONST(0x20), cl)         \
475
-    EMIT1(je, LABELREF(1,f))            \
476
-    EMIT1(ja, LABELREF(2,f))            \
477
-    EMIT2(shr, cl, eax)                 \
478
-    EMIT1(setc, bl)                     \
479
-    EMIT1(jmp, LABELREF(0,f))           \
480
-    LABEL(1)                            \
481
-    EMIT2(test, eax, eax)               \
482
-    EMIT1(sets, bl)                     \
483
-    EMIT2(xor, eax, eax)                \
484
-    EMIT1(jmp, LABELREF(0,f))           \
485
-    LABEL(2)                            \
486
-    EMIT2(xor, ebx, ebx)                \
487
-    EMIT2(xor, eax, eax)                \
488
-    LABEL(0)
489
-#define VALUE_LSR_REG_NC \
490
-    VALUE_LOAD_REG                      \
491
-    EMIT2(cmp, KONST(0x20), cl)         \
492
-    EMIT1(jae, LABELREF(1,f))           \
493
-    EMIT2(shr, cl, eax)                 \
494
-    EMIT1(jmp, LABELREF(0,f))           \
495
-    LABEL(1)                            \
496
-    EMIT2(xor, eax, eax)                \
497
-    LABEL(0)
385
+#  define VALUE_LSR_REG_C \
386
+	VALUE_LOAD_REG \
387
+	EMIT2(test, cl, cl) \
388
+	EMIT1(jz, LABELREF(0, f)) \
389
+	EMIT2(cmp, KONST(0x20), cl) \
390
+	EMIT1(je, LABELREF(1, f)) \
391
+	EMIT1(ja, LABELREF(2, f)) \
392
+	EMIT2(shr, cl, eax) \
393
+	EMIT1(setc, bl) \
394
+	EMIT1(jmp, LABELREF(0, f)) \
395
+	LABEL(1) \
396
+	EMIT2(test, eax, eax) \
397
+	EMIT1(sets, bl) \
398
+	EMIT2(xor, eax, eax) \
399
+	EMIT1(jmp, LABELREF(0, f)) \
400
+	LABEL(2) \
401
+	EMIT2(xor, ebx, ebx) \
402
+	EMIT2(xor, eax, eax) \
403
+	LABEL(0)
404
+#  define VALUE_LSR_REG_NC \
405
+	VALUE_LOAD_REG \
406
+	EMIT2(cmp, KONST(0x20), cl) \
407
+	EMIT1(jae, LABELREF(1, f)) \
408
+	EMIT2(shr, cl, eax) \
409
+	EMIT1(jmp, LABELREF(0, f)) \
410
+	LABEL(1) \
411
+	EMIT2(xor, eax, eax) \
412
+	LABEL(0)
498 413
 
499 414
 // OP Rd,Rb,Rm ASR #
500
-#define VALUE_ASR_IMM_C \
501
-    VALUE_LOAD_IMM                      \
502
-    EMIT1(jz, LABELREF(1,f))            \
503
-    EMIT2(sar, cl, eax)                 \
504
-    EMIT1(setc, bl)                     \
505
-    EMIT1(jmp, LABELREF(0,f))           \
506
-    LABEL(1)                            \
507
-    EMIT2(sar, KONST(31), eax)          \
508
-    EMIT1(sets, bl)                     \
509
-    LABEL(0)
510
-#define VALUE_ASR_IMM_NC \
511
-    VALUE_LOAD_IMM                      \
512
-    EMIT1(jz, LABELREF(1,f))            \
513
-    EMIT2(sar, cl, eax)                 \
514
-    EMIT1(jmp, LABELREF(0,f))           \
515
-    LABEL(1)                            \
516
-    EMIT2(sar, KONST(31), eax)          \
517
-    LABEL(0)
415
+#  define VALUE_ASR_IMM_C \
416
+	VALUE_LOAD_IMM \
417
+	EMIT1(jz, LABELREF(1, f)) \
418
+	EMIT2(sar, cl, eax) \
419
+	EMIT1(setc, bl) \
420
+	EMIT1(jmp, LABELREF(0, f)) \
421
+	LABEL(1) \
422
+	EMIT2(sar, KONST(31), eax) \
423
+	EMIT1(sets, bl) \
424
+	LABEL(0)
425
+#  define VALUE_ASR_IMM_NC \
426
+	VALUE_LOAD_IMM \
427
+	EMIT1(jz, LABELREF(1, f)) \
428
+	EMIT2(sar, cl, eax) \
429
+	EMIT1(jmp, LABELREF(0, f)) \
430
+	LABEL(1) \
431
+	EMIT2(sar, KONST(31), eax) \
432
+	LABEL(0)
518 433
 
519 434
 // OP Rd,Rb,Rm ASR Rs
520
-#define VALUE_ASR_REG_C \
521
-    VALUE_LOAD_REG                      \
522
-    EMIT2(test, cl, cl)                 \
523
-    EMIT1(jz, LABELREF(0,f))            \
524
-    EMIT2(cmp, KONST(0x20), cl)         \
525
-    EMIT1(jae, LABELREF(1,f))           \
526
-    EMIT2(sar, cl, eax)                 \
527
-    EMIT1(setc, bl)                     \
528
-    EMIT1(jmp, LABELREF(0,f))           \
529
-    LABEL(1)                            \
530
-    EMIT2(sar, KONST(31), eax)          \
531
-    EMIT1(sets, bl)                     \
532
-    LABEL(0)
533
-#define VALUE_ASR_REG_NC \
534
-    VALUE_LOAD_REG                      \
535
-    EMIT2(cmp, KONST(0x20), cl)         \
536
-    EMIT1(jae, LABELREF(1,f))           \
537
-    EMIT2(sar, cl, eax)                 \
538
-    EMIT1(jmp, LABELREF(0,f))           \
539
-    LABEL(1)                            \
540
-    EMIT2(sar, KONST(31), eax)          \
541
-    LABEL(0)
435
+#  define VALUE_ASR_REG_C \
436
+	VALUE_LOAD_REG \
437
+	EMIT2(test, cl, cl) \
438
+	EMIT1(jz, LABELREF(0, f)) \
439
+	EMIT2(cmp, KONST(0x20), cl) \
440
+	EMIT1(jae, LABELREF(1, f)) \
441
+	EMIT2(sar, cl, eax) \
442
+	EMIT1(setc, bl) \
443
+	EMIT1(jmp, LABELREF(0, f)) \
444
+	LABEL(1) \
445
+	EMIT2(sar, KONST(31), eax) \
446
+	EMIT1(sets, bl) \
447
+	LABEL(0)
448
+#  define VALUE_ASR_REG_NC \
449
+	VALUE_LOAD_REG \
450
+	EMIT2(cmp, KONST(0x20), cl) \
451
+	EMIT1(jae, LABELREF(1, f)) \
452
+	EMIT2(sar, cl, eax) \
453
+	EMIT1(jmp, LABELREF(0, f)) \
454
+	LABEL(1) \
455
+	EMIT2(sar, KONST(31), eax) \
456
+	LABEL(0)
542 457
 
543 458
 // OP Rd,Rb,Rm ROR #
544
-#define VALUE_ROR_IMM_C \
545
-    VALUE_LOAD_IMM                      \
546
-    EMIT1(jz, LABELREF(1,f))            \
547
-    EMIT2(ror, cl, eax)                 \
548
-    EMIT1(jmp, LABELREF(0,f))           \
549
-    LABEL(1)                            \
550
-    EMIT2(bt, KONST(0), ebx)            \
551
-    EMIT2(rcr, KONST(1), eax)           \
552
-    LABEL(0)                            \
553
-    EMIT1(setc, bl)
554
-#define VALUE_ROR_IMM_NC \
555
-    VALUE_LOAD_IMM                      \
556
-    EMIT1(jz, LABELREF(1,f))            \
557
-    EMIT2(ror, cl, eax)                 \
558
-    EMIT1(jmp, LABELREF(0,f))           \
559
-    LABEL(1)                            \
560
-    EMIT2(bt, KONST(0), VARL(C_FLAG))   \
561
-    EMIT2(rcr, KONST(1), eax)           \
562
-    LABEL(0)
459
+#  define VALUE_ROR_IMM_C \
460
+	VALUE_LOAD_IMM \
461
+	EMIT1(jz, LABELREF(1, f)) \
462
+	EMIT2(ror, cl, eax) \
463
+	EMIT1(jmp, LABELREF(0, f)) \
464
+	LABEL(1) \
465
+	EMIT2(bt, KONST(0), ebx) \
466
+	EMIT2(rcr, KONST(1), eax) \
467
+	LABEL(0) \
468
+	EMIT1(setc, bl)
469
+#  define VALUE_ROR_IMM_NC \
470
+	VALUE_LOAD_IMM \
471
+	EMIT1(jz, LABELREF(1, f)) \
472
+	EMIT2(ror, cl, eax) \
473
+	EMIT1(jmp, LABELREF(0, f)) \
474
+	LABEL(1) \
475
+	EMIT2(bt, KONST(0), VARL(C_FLAG)) \
476
+	EMIT2(rcr, KONST(1), eax) \
477
+	LABEL(0)
563 478
 
564 479
 // OP Rd,Rb,Rm ROR Rs
565
-#define VALUE_ROR_REG_C \
566
-    VALUE_LOAD_REG                      \
567
-    EMIT2(bt, KONST(0), ebx)            \
568
-    EMIT2(ror, cl, eax)                 \
569
-    EMIT1(setc, bl)
570
-#define VALUE_ROR_REG_NC \
571
-    VALUE_LOAD_REG                      \
572
-    EMIT2(ror, cl, eax)
480
+#  define VALUE_ROR_REG_C \
481
+	VALUE_LOAD_REG \
482
+	EMIT2(bt, KONST(0), ebx) \
483
+	EMIT2(ror, cl, eax) \
484
+	EMIT1(setc, bl)
485
+#  define VALUE_ROR_REG_NC \
486
+	VALUE_LOAD_REG \
487
+	EMIT2(ror, cl, eax)
573 488
 
574 489
 // OP Rd,Rb,# ROR #
575
-#define VALUE_IMM_C \
576
-    EMIT2(movzx, ch, ecx)               \
577
-    EMIT2(add, ecx, ecx)                \
578
-    EMIT2(movzx, al, eax)               \
579
-    EMIT2(bt, KONST(0), ebx)            \
580
-    EMIT2(ror, cl, eax)                 \
581
-    EMIT1(setc, bl)
582
-#define VALUE_IMM_NC \
583
-    EMIT2(movzx, ch, ecx)               \
584
-    EMIT2(add, ecx, ecx)                \
585
-    EMIT2(movzx, al, eax)               \
586
-    EMIT2(ror, cl, eax)
490
+#  define VALUE_IMM_C \
491
+	EMIT2(movzx, ch, ecx) \
492
+	EMIT2(add, ecx, ecx) \
493
+	EMIT2(movzx, al, eax) \
494
+	EMIT2(bt, KONST(0), ebx) \
495
+	EMIT2(ror, cl, eax) \
496
+	EMIT1(setc, bl)
497
+#  define VALUE_IMM_NC \
498
+	EMIT2(movzx, ch, ecx) \
499
+	EMIT2(add, ecx, ecx) \
500
+	EMIT2(movzx, al, eax) \
501
+	EMIT2(ror, cl, eax)
587 502
 
588 503
 // Macros to perform ALU ops
589 504
 
590 505
 // Set condition codes iff the destination register is not R15 (PC)
591
-#define CHECK_PC(OP, SETCOND) \
592
-    EMIT2(cmp, KONST(0x3C), esi)        \
593
-    EMIT1(je, LABELREF(8,f))            \
594
-    OP SETCOND                          \
595
-    EMIT1(jmp, LABELREF(9,f))           \
596
-    LABEL(8)                            \
597
-    OP                                  \
598
-    LABEL(9)
599
-
600
-#define OP_AND \
601
-    EMIT2(and, eax, edx)                \
602
-    EMIT2(mov, edx, REGREF1(esi))
603
-#define OP_ANDS   CHECK_PC(OP_AND, SETCOND_LOGICAL)
604
-#define OP_EOR \
605
-    EMIT2(xor, eax, edx)                \
606
-    EMIT2(mov, edx, REGREF1(esi))
607
-#define OP_EORS   CHECK_PC(OP_EOR, SETCOND_LOGICAL)
608
-#define OP_SUB \
609
-    EMIT2(sub, eax, edx)                \
610
-    EMIT2(mov, edx, REGREF1(esi))
611
-#define OP_SUBS   CHECK_PC(OP_SUB, SETCOND_SUB)
612
-#define OP_RSB \
613
-    EMIT2(sub, edx, eax)                \
614
-    EMIT2(mov, eax, REGREF1(esi))
615
-#define OP_RSBS   CHECK_PC(OP_RSB, SETCOND_SUB)
616
-#define OP_ADD \
617
-    EMIT2(add, eax, edx)                \
618
-    EMIT2(mov, edx, REGREF1(esi))
619
-#define OP_ADDS   CHECK_PC(OP_ADD, SETCOND_ADD)
620
-#define OP_ADC \
621
-    EMIT2(bt, KONST(0), VARL(C_FLAG))   \
622
-    EMIT2(adc, eax, edx)                \
623
-    EMIT2(mov, edx, REGREF1(esi))
624
-#define OP_ADCS   CHECK_PC(OP_ADC, SETCOND_ADD)
625
-#define OP_SBC \
626
-    EMIT2(bt, KONST(0), VARL(C_FLAG))   \
627
-    EMIT0(cmc)                          \
628
-    EMIT2(sbb, eax, edx)                \
629
-    EMIT2(mov, edx, REGREF1(esi))
630
-#define OP_SBCS   CHECK_PC(OP_SBC, SETCOND_SUB)
631
-#define OP_RSC \
632
-    EMIT2(bt, KONST(0), VARL(C_FLAG))   \
633
-    EMIT0(cmc)                          \
634
-    EMIT2(sbb, edx, eax)                \
635
-    EMIT2(mov, eax, REGREF1(esi))
636
-#define OP_RSCS   CHECK_PC(OP_RSC, SETCOND_SUB)
637
-#define OP_TST \
638
-    EMIT2(and, eax, edx)                \
639
-    SETCOND_LOGICAL
640
-#define OP_TEQ \
641
-    EMIT2(xor, eax, edx)                \
642
-    SETCOND_LOGICAL
643
-#define OP_CMP \
644
-    EMIT2(sub, eax, edx)                \
645
-    SETCOND_SUB
646
-#define OP_CMN \
647
-    EMIT2(add, eax, edx)                \
648
-    SETCOND_ADD
649
-#define OP_ORR \
650
-    EMIT2(or, eax, edx)                 \
651
-    EMIT2(mov, edx, REGREF1(esi))
652
-#define OP_ORRS   CHECK_PC(OP_ORR, SETCOND_LOGICAL)
653
-#define OP_MOV \
654
-    EMIT2(mov, eax, REGREF1(esi))
655
-#define OP_MOVS   CHECK_PC(EMIT2(test,eax,eax) EMIT2(mov,eax,REGREF1(esi)), SETCOND_LOGICAL)
656
-#define OP_BIC \
657
-    EMIT1(not, eax)                     \
658
-    EMIT2(and, eax, edx)                \
659
-    EMIT2(mov, edx, REGREF1(esi))
660
-#define OP_BICS   CHECK_PC(OP_BIC, SETCOND_LOGICAL)
661
-#define OP_MVN \
662
-    EMIT1(not, eax)                     \
663
-    EMIT2(mov, eax, REGREF1(esi))
664
-#define OP_MVNS   CHECK_PC(OP_MVN EMIT2(test,eax,eax), SETCOND_LOGICAL)
506
+#  define CHECK_PC(OP, SETCOND) \
507
+	EMIT2(cmp, KONST(0x3C), esi) \
508
+	EMIT1(je, LABELREF(8, f)) \
509
+	OP SETCOND \
510
+	EMIT1(jmp, LABELREF(9, f)) \
511
+	LABEL(8) \
512
+	OP \
513
+	LABEL(9)
514
+
515
+#  define OP_AND \
516
+	EMIT2(and, eax, edx) \
517
+	EMIT2(mov, edx, REGREF1(esi))
518
+#  define OP_ANDS CHECK_PC(OP_AND, SETCOND_LOGICAL)
519
+#  define OP_EOR \
520
+	EMIT2(xor, eax, edx) \
521
+	EMIT2(mov, edx, REGREF1(esi))
522
+#  define OP_EORS CHECK_PC(OP_EOR, SETCOND_LOGICAL)
523
+#  define OP_SUB \
524
+	EMIT2(sub, eax, edx) \
525
+	EMIT2(mov, edx, REGREF1(esi))
526
+#  define OP_SUBS CHECK_PC(OP_SUB, SETCOND_SUB)
527
+#  define OP_RSB \
528
+	EMIT2(sub, edx, eax) \
529
+	EMIT2(mov, eax, REGREF1(esi))
530
+#  define OP_RSBS CHECK_PC(OP_RSB, SETCOND_SUB)
531
+#  define OP_ADD \
532
+	EMIT2(add, eax, edx) \
533
+	EMIT2(mov, edx, REGREF1(esi))
534
+#  define OP_ADDS CHECK_PC(OP_ADD, SETCOND_ADD)
535
+#  define OP_ADC \
536
+	EMIT2(bt, KONST(0), VARL(C_FLAG)) \
537
+	EMIT2(adc, eax, edx) \
538
+	EMIT2(mov, edx, REGREF1(esi))
539
+#  define OP_ADCS CHECK_PC(OP_ADC, SETCOND_ADD)
540
+#  define OP_SBC \
541
+	EMIT2(bt, KONST(0), VARL(C_FLAG)) \
542
+	EMIT0(cmc) \
543
+	EMIT2(sbb, eax, edx) \
544
+	EMIT2(mov, edx, REGREF1(esi))
545
+#  define OP_SBCS CHECK_PC(OP_SBC, SETCOND_SUB)
546
+#  define OP_RSC \
547
+	EMIT2(bt, KONST(0), VARL(C_FLAG)) \
548
+	EMIT0(cmc) \
549
+	EMIT2(sbb, edx, eax) \
550
+	EMIT2(mov, eax, REGREF1(esi))
551
+#  define OP_RSCS CHECK_PC(OP_RSC, SETCOND_SUB)
552
+#  define OP_TST \
553
+	EMIT2(and, eax, edx) \
554
+	SETCOND_LOGICAL
555
+#  define OP_TEQ \
556
+	EMIT2(xor, eax, edx) \
557
+	SETCOND_LOGICAL
558
+#  define OP_CMP \
559
+	EMIT2(sub, eax, edx) \
560
+	SETCOND_SUB
561
+#  define OP_CMN \
562
+	EMIT2(add, eax, edx) \
563
+	SETCOND_ADD
564
+#  define OP_ORR \
565
+	EMIT2(or, eax, edx) \
566
+	EMIT2(mov, edx, REGREF1(esi))
567
+#  define OP_ORRS CHECK_PC(OP_ORR, SETCOND_LOGICAL)
568
+#  define OP_MOV \
569
+	EMIT2(mov, eax, REGREF1(esi))
570
+#  define OP_MOVS CHECK_PC(EMIT2(test, eax, eax) EMIT2(mov, eax, REGREF1(esi)), SETCOND_LOGICAL)
571
+#  define OP_BIC \
572
+	EMIT1(not, eax) \
573
+	EMIT2(and, eax, edx) \
574
+	EMIT2(mov, edx, REGREF1(esi))
575
+#  define OP_BICS CHECK_PC(OP_BIC, SETCOND_LOGICAL)
576
+#  define OP_MVN \
577
+	EMIT1(not, eax) \
578
+	EMIT2(mov, eax, REGREF1(esi))
579
+#  define OP_MVNS CHECK_PC(OP_MVN EMIT2(test, eax, eax), SETCOND_LOGICAL)
665 580
 
666 581
 // ALU cleanup macro
667
-#define ALU_FINISH  ALU_TRAILER
582
+#  define ALU_FINISH  ALU_TRAILER
668 583
 
669 584
 // End of ALU macros
670 585
 //X//#endif //_MSC_VER
671
-
672
-#ifdef __GNUC__
673
-
674
-#define ROR_IMM_MSR \
675
-    asm ("ror %%cl, %%eax;"             \
676
-         : "=a" (value)                 \
677
-         : "a" (opcode & 0xFF), "c" (shift));
678
-
679
-#define ROR_OFFSET \
680
-    asm("ror %%cl, %0"                  \
681
-        : "=r" (offset)                 \
682
-        : "0" (offset), "c" (shift));
683
-
684
-#define RRX_OFFSET \
685
-    asm(EMIT2(btl,KONST(0),VAR(C_FLAG)) \
686
-        "rcr $1, %0"                    \
687
-        : "=r" (offset)                 \
688
-        : "0" (offset));
689
-
690
-#else  // !__GNUC__, i.e. Visual C++
691
-
692
-#define ROR_IMM_MSR \
693
-    __asm {                             \
694
-        __asm mov ecx, shift            \
695
-        __asm ror value, cl             \
696
-     }
697
-
698
-
699
-#define ROR_OFFSET \
700
-    __asm {                             \
701
-        __asm mov ecx, shift            \
702
-        __asm ror offset, cl            \
703
-    }
704
-
705
-#define RRX_OFFSET \
706
-    __asm {                             \
707
-        __asm bt dword ptr C_FLAG, 0    \
708
-        __asm rcr offset, 1             \
709
-    }
710
-
711
-#endif  // !__GNUC__
712
-
713
-#endif  // !__POWERPC__
586
+#  ifdef __GNUC__
587
+#   define ROR_IMM_MSR \
588
+	asm("ror %%cl, %%eax;" \
589
+		: "=a" (value) \
590
+		: "a" (opcode & 0xFF), "c" (shift));
591
+
592
+#   define ROR_OFFSET \
593
+	asm("ror %%cl, %0" \
594
+		: "=r" (offset) \
595
+		: "0" (offset), "c" (shift));
596
+
597
+#   define RRX_OFFSET \
598
+	asm(EMIT2(btl, KONST(0), VAR(C_FLAG)) \
599
+		"rcr $1, %0" \
600
+		: "=r" (offset) \
601
+		: "0" (offset));
602
+
603
+#  else  // !__GNUC__, i.e. Visual C++
604
+#   define ROR_IMM_MSR \
605
+	__asm \
606
+	{ \
607
+		__asm mov ecx, shift \
608
+		__asm ror value, cl \
609
+	}
610
+
611
+#   define ROR_OFFSET \
612
+	__asm \
613
+	{ \
614
+		__asm mov ecx, shift \
615
+		__asm ror offset, cl \
616
+	}
617
+
618
+#   define RRX_OFFSET \
619
+	__asm \
620
+	{ \
621
+		__asm bt dword ptr C_FLAG, 0 \
622
+		__asm rcr offset, 1 \
623
+	}
624
+
625
+#  endif  // !__GNUC__
626
+# endif  // !__POWERPC__
714 627
 #endif  // !C_CORE
715 628
 
716 629
 // C core
717 630
 
718 631
 #define C_SETCOND_LOGICAL \
719
-    N_FLAG = ((int32_t)res < 0) ? true : false;             \
720
-    Z_FLAG = (res == 0) ? true : false;                 \
721
-    C_FLAG = C_OUT;
632
+	N_FLAG = static_cast<int32_t>(res) < 0; \
633
+	Z_FLAG = !res; \
634
+	C_FLAG = C_OUT;
722 635
 #define C_SETCOND_ADD \
723
-    N_FLAG = ((int32_t)res < 0) ? true : false;             \
724
-    Z_FLAG = (res == 0) ? true : false;                 \
725
-    V_FLAG = ((NEG(lhs) & NEG(rhs) & POS(res)) |        \
726
-              (POS(lhs) & POS(rhs) & NEG(res))) ? true : false;\
727
-    C_FLAG = ((NEG(lhs) & NEG(rhs)) |                   \
728
-              (NEG(lhs) & POS(res)) |                   \
729
-              (NEG(rhs) & POS(res))) ? true : false;
636
+	N_FLAG = static_cast<int32_t>(res) < 0; \
637
+	Z_FLAG = !res; \
638
+	V_FLAG = !!((NEG(lhs) & NEG(rhs) & POS(res)) | (POS(lhs) & POS(rhs) & NEG(res))); \
639
+	C_FLAG = !!((NEG(lhs) & NEG(rhs)) | (NEG(lhs) & POS(res)) | (NEG(rhs) & POS(res)));
730 640
 #define C_SETCOND_SUB \
731
-    N_FLAG = ((int32_t)res < 0) ? true : false;             \
732
-    Z_FLAG = (res == 0) ? true : false;                 \
733
-    V_FLAG = ((NEG(lhs) & POS(rhs) & POS(res)) |        \
734
-              (POS(lhs) & NEG(rhs) & NEG(res))) ? true : false;\
735
-    C_FLAG = ((NEG(lhs) & POS(rhs)) |                   \
736
-              (NEG(lhs) & POS(res)) |                   \
737
-              (POS(rhs) & POS(res))) ? true : false;
641
+	N_FLAG = static_cast<int32_t>(res) < 0; \
642
+	Z_FLAG = !res; \
643
+	V_FLAG = !!((NEG(lhs) & POS(rhs) & POS(res)) | (POS(lhs) & NEG(rhs) & NEG(res))); \
644
+	C_FLAG = !!((NEG(lhs) & POS(rhs)) | (NEG(lhs) & POS(res)) | (POS(rhs) & POS(res)));
738 645
 
739 646
 #ifndef ALU_INIT_C
740
- #define ALU_INIT_C \
741
-    int dest = (opcode>>12) & 15;                       \
742
-    bool C_OUT = C_FLAG;                                \
743
-    uint32_t value;
647
+# define ALU_INIT_C \
648
+	int dest = (opcode >> 12) & 15; \
649
+	bool C_OUT = C_FLAG; \
650
+	uint32_t value;
744 651
 #endif
745 652
 // OP Rd,Rb,Rm LSL #
746 653
 #ifndef VALUE_LSL_IMM_C
747
- #define VALUE_LSL_IMM_C \
748
-    unsigned int shift = (opcode >> 7) & 0x1F;          \
749
-    if (LIKELY(!shift)) {  /* LSL #0 most common? */    \
750
-        value = reg[opcode & 0x0F].I;                   \
751
-    } else {                                            \
752
-        uint32_t v = reg[opcode & 0x0F].I;                   \
753
-        C_OUT = (v >> (32 - shift)) & 1 ? true : false; \
754
-        value = v << shift;                             \
755
-    }
654
+# define VALUE_LSL_IMM_C \
655
+	unsigned shift = (opcode >> 7) & 0x1F; \
656
+	if (LIKELY(!shift)) /* LSL #0 most common? */ \
657
+		value = reg[opcode & 0x0F].I; \
658
+	else \
659
+	{ \
660
+		uint32_t v = reg[opcode & 0x0F].I; \
661
+		C_OUT = !!((v >> (32 - shift)) & 1); \
662
+		value = v << shift; \
663
+	}
756 664
 #endif
757 665
 // OP Rd,Rb,Rm LSL Rs
758 666
 #ifndef VALUE_LSL_REG_C
759
- #define VALUE_LSL_REG_C \
760
-    uint32_t shift = reg[(opcode >> 8)&15].B.B0;                  \
761
-    uint32_t rm = reg[opcode & 0x0F].I;                           \
762
-    if((opcode & 0x0F) == 15) {                              \
763
-        rm += 4;                                             \
764
-    }                                                        \
765
-    if (LIKELY(shift)) {                                \
766
-        if (shift == 32) {                              \
767
-            value = 0;                                  \
768
-            C_OUT = (rm & 1 ? true : false);                 \
769
-        } else if (LIKELY(shift < 32)) {                \
770
-            uint32_t v = rm;                                      \
771
-            C_OUT = (v >> (32 - shift)) & 1 ? true : false;\
772
-            value = v << shift;                         \
773
-        } else {                                        \
774
-            value = 0;                                  \
775
-            C_OUT = false;                              \
776
-        }                                               \
777
-    } else {                                            \
778
-        value = rm;                                          \
779
-    }
667
+# define VALUE_LSL_REG_C \
668
+	uint32_t shift = reg[(opcode >> 8) & 15].B.B0; \
669
+	uint32_t rm = reg[opcode & 0x0F].I; \
670
+	if ((opcode & 0x0F) == 15) \
671
+		rm += 4; \
672
+	if (LIKELY(shift)) \
673
+	{ \
674
+		if (shift == 32) \
675
+		{ \
676
+			value = 0; \
677
+			C_OUT = !!(rm & 1); \
678
+		} \
679
+		else if (LIKELY(shift < 32)) \
680
+		{ \
681
+			uint32_t v = rm; \
682
+			C_OUT = !!((v >> (32 - shift)) & 1); \
683
+			value = v << shift; \
684
+		} \
685
+		else \
686
+		{ \
687
+			value = 0; \
688
+			C_OUT = false; \
689
+		} \
690
+	} \
691
+	else
692
+		value = rm;
780 693
 #endif
781 694
 // OP Rd,Rb,Rm LSR #
782 695
 #ifndef VALUE_LSR_IMM_C
783
- #define VALUE_LSR_IMM_C \
784
-    uint32_t shift = (opcode >> 7) & 0x1F;                   \
785
-    if (LIKELY(shift)) {                                \
786
-        uint32_t v = reg[opcode & 0x0F].I;                   \
787
-        C_OUT = (v >> (shift - 1)) & 1 ? true : false;  \
788
-        value = v >> shift;                             \
789
-    } else {                                            \
790
-        value = 0;                                      \
791
-        C_OUT = (reg[opcode & 0x0F].I & 0x80000000) ? true : false;\
792
-    }
696
+# define VALUE_LSR_IMM_C \
697
+	uint32_t shift = (opcode >> 7) & 0x1F; \
698
+	if (LIKELY(shift)) \
699
+	{ \
700
+		uint32_t v = reg[opcode & 0x0F].I; \
701
+		C_OUT = !!((v >> (shift - 1)) & 1); \
702
+		value = v >> shift; \
703
+	} \
704
+	else \
705
+	{ \
706
+		value = 0; \
707
+		C_OUT = !!(reg[opcode & 0x0F].I & 0x80000000); \
708
+	}
793 709
 #endif
794 710
 // OP Rd,Rb,Rm LSR Rs
795 711
 #ifndef VALUE_LSR_REG_C
796
- #define VALUE_LSR_REG_C \
797
-    unsigned int shift = reg[(opcode >> 8)&15].B.B0;    \
798
-    uint32_t rm = reg[opcode & 0x0F].I;                      \
799
-    if((opcode & 0x0F) == 15) {                         \
800
-        rm += 4;                                            \
801
-    }                                                   \
802
-    if (LIKELY(shift)) {                                \
803
-        if (shift == 32) {                              \
804
-            value = 0;                                  \
805
-            C_OUT = (rm & 0x80000000 ? true : false);\
806
-        } else if (LIKELY(shift < 32)) {                \
807
-            uint32_t v = rm;               \
808
-            C_OUT = (v >> (shift - 1)) & 1 ? true : false;\
809
-            value = v >> shift;                         \
810
-        } else {                                        \
811
-            value = 0;                                  \
812
-            C_OUT = false;                              \
813
-        }                                               \
814
-    } else {                                            \
815
-        value = rm;                   \
816
-    }
712
+# define VALUE_LSR_REG_C \
713
+	unsigned shift = reg[(opcode >> 8) & 15].B.B0; \
714
+	uint32_t rm = reg[opcode & 0x0F].I; \
715
+	if ((opcode & 0x0F) == 15) \
716
+		rm += 4; \
717
+	if (LIKELY(shift)) \
718
+	{ \
719
+		if (shift == 32) \
720
+		{ \
721
+			value = 0; \
722
+			C_OUT = !!(rm & 0x80000000); \
723
+		} \
724
+		else if (LIKELY(shift < 32)) \
725
+		{ \
726
+			uint32_t v = rm; \
727
+			C_OUT = !!((v >> (shift - 1)) & 1); \
728
+			value = v >> shift; \
729
+		} \
730
+		else \
731
+		{ \
732
+			value = 0; \
733
+			C_OUT = false; \
734
+		} \
735
+	} \
736
+	else
737
+		value = rm;
817 738
 #endif
818 739
 // OP Rd,Rb,Rm ASR #
819 740
 #ifndef VALUE_ASR_IMM_C
820
- #define VALUE_ASR_IMM_C \
821
-    unsigned int shift = (opcode >> 7) & 0x1F;          \
822
-    if (LIKELY(shift)) {                                \
823
-        /* VC++ BUG: u32 v; (s32)v>>n is optimized to shr! */ \
824
-        int32_t v = reg[opcode & 0x0F].I;                   \
825
-        C_OUT = (v >> (int)(shift - 1)) & 1 ? true : false;\
826
-        value = v >> (int)shift;                        \
827
-    } else {                                            \
828
-        if (reg[opcode & 0x0F].I & 0x80000000) {        \
829
-            value = 0xFFFFFFFF;                         \
830
-            C_OUT = true;                               \
831
-        } else {                                        \
832
-            value = 0;                                  \
833
-            C_OUT = false;                              \
834
-        }                                               \
835
-    }
741
+# define VALUE_ASR_IMM_C \
742
+	unsigned shift = (opcode >> 7) & 0x1F; \
743
+	if (LIKELY(shift)) \
744
+	{ \
745
+		/* VC++ BUG: u32 v; (s32)v>>n is optimized to shr! */ \
746
+		int32_t v = reg[opcode & 0x0F].I; \
747
+		C_OUT = !!((v >> static_cast<int>(shift - 1)) & 1); \
748
+		value = v >> static_cast<int>(shift); \
749
+	} \
750
+	else \
751
+	{ \
752
+		if (reg[opcode & 0x0F].I & 0x80000000) \
753
+		{ \
754
+			value = 0xFFFFFFFF; \
755
+			C_OUT = true; \
756
+		} \
757
+		else \
758
+		{ \
759
+			value = 0; \
760
+			C_OUT = false; \
761
+		} \
762
+	}
836 763
 #endif
837 764
 // OP Rd,Rb,Rm ASR Rs
838 765
 #ifndef VALUE_ASR_REG_C
839
- #define VALUE_ASR_REG_C \
840
-    unsigned int shift = reg[(opcode >> 8)&15].B.B0;    \
841
-    uint32_t rm = reg[opcode & 0x0F].I;                      \
842
-    if((opcode & 0x0F) == 15) {                         \
843
-        rm += 4;                                            \
844
-    }                                                   \
845
-    if (LIKELY(shift < 32)) {                           \
846
-        if (LIKELY(shift)) {                            \
847
-            int32_t v = rm;               \
848
-            C_OUT = (v >> (int)(shift - 1)) & 1 ? true : false;\
849
-            value = v >> (int)shift;                    \
850
-        } else {                                        \
851
-            value = rm;               \
852
-        }                                               \
853
-    } else {                                            \
854
-        if (reg[opcode & 0x0F].I & 0x80000000) {        \
855
-            value = 0xFFFFFFFF;                         \
856
-            C_OUT = true;                               \
857
-        } else {                                        \
858
-            value = 0;                                  \
859
-            C_OUT = false;                              \
860
-        }                                               \
861
-    }
766
+# define VALUE_ASR_REG_C \
767
+	unsigned shift = reg[(opcode >> 8) & 15].B.B0; \
768
+	uint32_t rm = reg[opcode & 0x0F].I; \
769
+	if ((opcode & 0x0F) == 15) \
770
+		rm += 4; \
771
+	if (LIKELY(shift < 32)) \
772
+	{ \
773
+		if (LIKELY(shift)) \
774
+		{ \
775
+			int32_t v = rm; \
776
+			C_OUT = !!((v >> static_cast<int>(shift - 1)) & 1); \
777
+			value = v >> static_cast<int>(shift); \
778
+		} \
779
+		else \
780
+			value = rm; \
781
+	} \
782
+	else \
783
+	{ \
784
+		if (reg[opcode & 0x0F].I & 0x80000000) \
785
+		{ \
786
+			value = 0xFFFFFFFF; \
787
+			C_OUT = true; \
788
+		} \
789
+		else \
790
+		{ \
791
+			value = 0; \
792
+			C_OUT = false; \
793
+		} \
794
+	}
862 795
 #endif
863 796
 // OP Rd,Rb,Rm ROR #
864 797
 #ifndef VALUE_ROR_IMM_C
865
- #define VALUE_ROR_IMM_C \
866
-    unsigned int shift = (opcode >> 7) & 0x1F;          \
867
-    if (LIKELY(shift)) {                                \
868
-        uint32_t v = reg[opcode & 0x0F].I;                   \
869
-        C_OUT = (v >> (shift - 1)) & 1 ? true : false;  \
870
-        value = ((v << (32 - shift)) |                  \
871
-                 (v >> shift));                         \
872
-    } else {                                            \
873
-        uint32_t v = reg[opcode & 0x0F].I;                   \
874
-        C_OUT = (v & 1) ? true : false;                 \
875
-        value = ((v >> 1) |                             \
876
-                 (C_FLAG << 31));                       \
877
-    }
798
+# define VALUE_ROR_IMM_C \
799
+	unsigned shift = (opcode >> 7) & 0x1F; \
800
+	if (LIKELY(shift)) \
801
+	{ \
802
+		uint32_t v = reg[opcode & 0x0F].I; \
803
+		C_OUT = !!((v >> (shift - 1)) & 1); \
804
+		value = (v << (32 - shift)) | (v >> shift); \
805
+	} \
806
+	else \
807
+	{ \
808
+		uint32_t v = reg[opcode & 0x0F].I; \
809
+		C_OUT = !!(v & 1); \
810
+		value = (v >> 1) | (C_FLAG << 31); \
811
+	}
878 812
 #endif
879 813
 // OP Rd,Rb,Rm ROR Rs
880 814
 #ifndef VALUE_ROR_REG_C
881
- #define VALUE_ROR_REG_C \
882
-    unsigned int shift = reg[(opcode >> 8)&15].B.B0;    \
883
-    uint32_t rm = reg[opcode & 0x0F].I;                      \
884
-    if((opcode & 0x0F) == 15) {                         \
885
-        rm += 4;                                            \
886
-    }                                                   \
887
-    if (LIKELY(shift & 0x1F)) {                         \
888
-        uint32_t v = rm;                   \
889
-        C_OUT = (v >> (shift - 1)) & 1 ? true : false;  \
890
-        value = ((v << (32 - shift)) |                  \
891
-                 (v >> shift));                         \
892
-    } else {                                            \
893
-        value = rm;                   \
894
-        if (shift)                                      \
895
-            C_OUT = (value & 0x80000000 ? true : false);\
896
-    }
815
+# define VALUE_ROR_REG_C \
816
+	unsigned shift = reg[(opcode >> 8) & 15].B.B0; \
817
+	uint32_t rm = reg[opcode & 0x0F].I; \
818
+	if ((opcode & 0x0F) == 15)
819
+		rm += 4; \
820
+	if (LIKELY(shift & 0x1F)) \
821
+	{ \
822
+		uint32_t v = rm; \
823
+		C_OUT = !((v >> (shift - 1)) & 1); \
824
+		value = (v << (32 - shift)) | (v >> shift); \
825
+	} \
826
+	else \
827
+	{ \
828
+		value = rm; \
829
+		if (shift) \
830
+			C_OUT = !!(value & 0x80000000); \
831
+	}
897 832
 #endif
898 833
 // OP Rd,Rb,# ROR #
899 834
 #ifndef VALUE_IMM_C
900
- #define VALUE_IMM_C \
901
-    int shift = (opcode & 0xF00) >> 7;                  \
902
-    if (UNLIKELY(shift)) {                              \
903
-        uint32_t v = opcode & 0xFF;                          \
904
-        C_OUT = (v >> (shift - 1)) & 1 ? true : false;  \
905
-        value = ((v << (32 - shift)) |                  \
906
-                 (v >> shift));                         \
907
-    } else {                                            \
908
-        value = opcode & 0xFF;                          \
909
-    }
835
+# define VALUE_IMM_C \
836
+	int shift = (opcode & 0xF00) >> 7; \
837
+	if (UNLIKELY(shift)) \
838
+	{ \
839
+		uint32_t v = opcode & 0xFF; \
840
+		C_OUT = !!((v >> (shift - 1)) & 1); \
841
+		value = (v << (32 - shift)) | (v >> shift); \
842
+	} \
843
+	else \
844
+		value = opcode & 0xFF;
910 845
 #endif
911 846
 
912 847
 // Make the non-carry versions default to the carry versions
913 848
 // (this is fine for C--the compiler will optimize the dead code out)
914 849
 #ifndef ALU_INIT_NC
915
- #define ALU_INIT_NC ALU_INIT_C
850
+# define ALU_INIT_NC ALU_INIT_C
916 851
 #endif
917 852
 #ifndef VALUE_LSL_IMM_NC
918
- #define VALUE_LSL_IMM_NC VALUE_LSL_IMM_C
853
+# define VALUE_LSL_IMM_NC VALUE_LSL_IMM_C
919 854
 #endif
920 855
 #ifndef VALUE_LSL_REG_NC
921
- #define VALUE_LSL_REG_NC VALUE_LSL_REG_C
856
+# define VALUE_LSL_REG_NC VALUE_LSL_REG_C
922 857
 #endif
923 858
 #ifndef VALUE_LSR_IMM_NC
924
- #define VALUE_LSR_IMM_NC VALUE_LSR_IMM_C
859
+# define VALUE_LSR_IMM_NC VALUE_LSR_IMM_C
925 860
 #endif
926 861
 #ifndef VALUE_LSR_REG_NC
927
- #define VALUE_LSR_REG_NC VALUE_LSR_REG_C
862
+# define VALUE_LSR_REG_NC VALUE_LSR_REG_C
928 863
 #endif
929 864
 #ifndef VALUE_ASR_IMM_NC
930
- #define VALUE_ASR_IMM_NC VALUE_ASR_IMM_C
865
+# define VALUE_ASR_IMM_NC VALUE_ASR_IMM_C
931 866
 #endif
932 867
 #ifndef VALUE_ASR_REG_NC
933
- #define VALUE_ASR_REG_NC VALUE_ASR_REG_C
868
+# define VALUE_ASR_REG_NC VALUE_ASR_REG_C
934 869
 #endif
935 870
 #ifndef VALUE_ROR_IMM_NC
936
- #define VALUE_ROR_IMM_NC VALUE_ROR_IMM_C
871
+# define VALUE_ROR_IMM_NC VALUE_ROR_IMM_C
937 872
 #endif
938 873
 #ifndef VALUE_ROR_REG_NC
939
- #define VALUE_ROR_REG_NC VALUE_ROR_REG_C
874
+# define VALUE_ROR_REG_NC VALUE_ROR_REG_C
940 875
 #endif
941 876
 #ifndef VALUE_IMM_NC
942
- #define VALUE_IMM_NC VALUE_IMM_C
877
+# define VALUE_IMM_NC VALUE_IMM_C
943 878
 #endif
944 879
 
945 880
 #define C_CHECK_PC(SETCOND) if (LIKELY(dest != 15)) { SETCOND }
946 881
 #ifndef OP_AND
947
- #define OP_AND \
948
-    uint32_t res = reg[(opcode>>16)&15].I & value;           \
949
-    reg[dest].I = res;
882
+# define OP_AND \
883
+	uint32_t res = reg[(opcode >> 16) & 15].I & value; \
884
+	reg[dest].I = res;
950 885
 #endif
951 886
 #ifndef OP_ANDS
952
- #define OP_ANDS   OP_AND C_CHECK_PC(C_SETCOND_LOGICAL)
887
+# define OP_ANDS OP_AND C_CHECK_PC(C_SETCOND_LOGICAL)
953 888
 #endif
954 889
 #ifndef OP_EOR
955
- #define OP_EOR \
956
-    uint32_t res = reg[(opcode>>16)&15].I ^ value;           \
957
-    reg[dest].I = res;
890
+# define OP_EOR \
891
+	uint32_t res = reg[(opcode >> 16) & 15].I ^ value; \
892
+	reg[dest].I = res;
958 893
 #endif
959 894
 #ifndef OP_EORS
960
- #define OP_EORS   OP_EOR C_CHECK_PC(C_SETCOND_LOGICAL)
895
+# define OP_EORS OP_EOR C_CHECK_PC(C_SETCOND_LOGICAL)
961 896
 #endif
962 897
 #ifndef OP_SUB
963
- #define OP_SUB \
964
-    uint32_t lhs = reg[(opcode>>16)&15].I;                   \
965
-    uint32_t rhs = value;                                    \
966
-    uint32_t res = lhs - rhs;                                \
967
-    reg[dest].I = res;
898
+# define OP_SUB \
899
+	uint32_t lhs = reg[(opcode >> 16) & 15].I; \
900
+	uint32_t rhs = value; \
901
+	uint32_t res = lhs - rhs; \
902
+	reg[dest].I = res;
968 903
 #endif
969 904
 #ifndef OP_SUBS
970
- #define OP_SUBS   OP_SUB C_CHECK_PC(C_SETCOND_SUB)
905
+# define OP_SUBS OP_SUB C_CHECK_PC(C_SETCOND_SUB)
971 906
 #endif
972 907
 #ifndef OP_RSB
973
- #define OP_RSB \
974
-    uint32_t lhs = value;                                    \
975
-    uint32_t rhs = reg[(opcode>>16)&15].I;                   \
976
-    uint32_t res = lhs - rhs;                                \
977
-    reg[dest].I = res;
908
+# define OP_RSB \
909
+	uint32_t lhs = value; \
910
+	uint32_t rhs = reg[(opcode >> 16) & 15].I; \
911
+	uint32_t res = lhs - rhs; \
912
+	reg[dest].I = res;
978 913
 #endif
979 914
 #ifndef OP_RSBS
980
- #define OP_RSBS   OP_RSB C_CHECK_PC(C_SETCOND_SUB)
915
+# define OP_RSBS   OP_RSB C_CHECK_PC(C_SETCOND_SUB)
981 916
 #endif
982 917
 #ifndef OP_ADD
983
- #define OP_ADD \
984
-    uint32_t lhs = reg[(opcode>>16)&15].I;                   \
985
-    uint32_t rhs = value;                                    \
986
-    uint32_t res = lhs + rhs;                                \
987
-    reg[dest].I = res;
918
+# define OP_ADD \
919
+	uint32_t lhs = reg[(opcode >> 16) & 15].I; \
920
+	uint32_t rhs = value; \
921
+	uint32_t res = lhs + rhs; \
922
+	reg[dest].I = res;
988 923
 #endif
989 924
 #ifndef OP_ADDS
990
- #define OP_ADDS   OP_ADD C_CHECK_PC(C_SETCOND_ADD)
925
+# define OP_ADDS OP_ADD C_CHECK_PC(C_SETCOND_ADD)
991 926
 #endif
992 927
 #ifndef OP_ADC
993
- #define OP_ADC \
994
-    uint32_t lhs = reg[(opcode>>16)&15].I;                   \
995
-    uint32_t rhs = value;                                    \
996
-    uint32_t res = lhs + rhs + (uint32_t)C_FLAG;                  \
997
-    reg[dest].I = res;
928
+# define OP_ADC \
929
+	uint32_t lhs = reg[(opcode >> 16) & 15].I; \
930
+	uint32_t rhs = value; \
931
+	uint32_t res = lhs + rhs + static_cast<uint32_t>(C_FLAG); \
932
+	reg[dest].I = res;
998 933
 #endif
999 934
 #ifndef OP_ADCS
1000
- #define OP_ADCS   OP_ADC C_CHECK_PC(C_SETCOND_ADD)
935
+# define OP_ADCS OP_ADC C_CHECK_PC(C_SETCOND_ADD)
1001 936
 #endif
1002 937
 #ifndef OP_SBC
1003
- #define OP_SBC \
1004
-    uint32_t lhs = reg[(opcode>>16)&15].I;                   \
1005
-    uint32_t rhs = value;                                    \
1006
-    uint32_t res = lhs - rhs - !((uint32_t)C_FLAG);               \
1007
-    reg[dest].I = res;
938
+# define OP_SBC \
939
+	uint32_t lhs = reg[(opcode >> 16) & 15].I; \
940
+	uint32_t rhs = value; \
941
+	uint32_t res = lhs - rhs - !static_cast<uint32_t>(C_FLAG); \
942
+	reg[dest].I = res;
1008 943
 #endif
1009 944
 #ifndef OP_SBCS
1010
- #define OP_SBCS   OP_SBC C_CHECK_PC(C_SETCOND_SUB)
945
+# define OP_SBCS OP_SBC C_CHECK_PC(C_SETCOND_SUB)
1011 946
 #endif
1012 947
 #ifndef OP_RSC
1013
- #define OP_RSC \
1014
-    uint32_t lhs = value;                                    \
1015
-    uint32_t rhs = reg[(opcode>>16)&15].I;                   \
1016
-    uint32_t res = lhs - rhs - !((uint32_t)C_FLAG);               \
1017
-    reg[dest].I = res;
948
+# define OP_RSC \
949
+	uint32_t lhs = value; \
950
+	uint32_t rhs = reg[(opcode >> 16) & 15].I; \
951
+	uint32_t res = lhs - rhs - !static_cast<uint32_t>(C_FLAG); \
952
+	reg[dest].I = res;
1018 953
 #endif
1019 954
 #ifndef OP_RSCS
1020
- #define OP_RSCS   OP_RSC C_CHECK_PC(C_SETCOND_SUB)
955
+# define OP_RSCS OP_RSC C_CHECK_PC(C_SETCOND_SUB)
1021 956
 #endif
1022 957
 #ifndef OP_TST
1023
- #define OP_TST \
1024
-    uint32_t res = reg[(opcode >> 16) & 0x0F].I & value;     \
1025
-    C_SETCOND_LOGICAL;
958
+# define OP_TST \
959
+	uint32_t res = reg[(opcode >> 16) & 0x0F].I & value; \
960
+	C_SETCOND_LOGICAL;
1026 961
 #endif
1027 962
 #ifndef OP_TEQ
1028
- #define OP_TEQ \
1029
-    uint32_t res = reg[(opcode >> 16) & 0x0F].I ^ value;     \
1030
-    C_SETCOND_LOGICAL;
963
+# define OP_TEQ \
964
+	uint32_t res = reg[(opcode >> 16) & 0x0F].I ^ value; \
965
+	C_SETCOND_LOGICAL;
1031 966
 #endif
1032 967
 #ifndef OP_CMP
1033
- #define OP_CMP \
1034
-    uint32_t lhs = reg[(opcode>>16)&15].I;                   \
1035
-    uint32_t rhs = value;                                    \
1036
-    uint32_t res = lhs - rhs;                                \
1037
-    C_SETCOND_SUB;
968
+# define OP_CMP \
969
+	uint32_t lhs = reg[(opcode >> 16) & 15].I; \
970
+	uint32_t rhs = value; \
971
+	uint32_t res = lhs - rhs; \
972
+	C_SETCOND_SUB;
1038 973
 #endif
1039 974
 #ifndef OP_CMN
1040
- #define OP_CMN \
1041
-    uint32_t lhs = reg[(opcode>>16)&15].I;                   \
1042
-    uint32_t rhs = value;                                    \
1043
-    uint32_t res = lhs + rhs;                                \
1044
-    C_SETCOND_ADD;
975
+# define OP_CMN \
976
+	uint32_t lhs = reg[(opcode >> 16) & 15].I; \
977
+	uint32_t rhs = value; \
978
+	uint32_t res = lhs + rhs; \
979
+	C_SETCOND_ADD;
1045 980
 #endif
1046 981
 #ifndef OP_ORR
1047
- #define OP_ORR \
1048
-    uint32_t res = reg[(opcode >> 16) & 0x0F].I | value;     \
1049
-    reg[dest].I = res;
982
+# define OP_ORR \
983
+	uint32_t res = reg[(opcode >> 16) & 0x0F].I | value; \
984
+	reg[dest].I = res;
1050 985
 #endif
1051 986
 #ifndef OP_ORRS
1052
- #define OP_ORRS   OP_ORR C_CHECK_PC(C_SETCOND_LOGICAL)
987
+# define OP_ORRS OP_ORR C_CHECK_PC(C_SETCOND_LOGICAL)
1053 988
 #endif
1054 989
 #ifndef OP_MOV
1055
- #define OP_MOV \
1056
-    uint32_t res = value;                                    \
1057
-    reg[dest].I = res;
990
+# define OP_MOV \
991
+	uint32_t res = value; \
992
+	reg[dest].I = res;
1058 993
 #endif
1059 994
 #ifndef OP_MOVS
1060
- #define OP_MOVS   OP_MOV C_CHECK_PC(C_SETCOND_LOGICAL)
995
+# define OP_MOVS OP_MOV C_CHECK_PC(C_SETCOND_LOGICAL)
1061 996
 #endif
1062 997
 #ifndef OP_BIC
1063
- #define OP_BIC \
1064
-    uint32_t res = reg[(opcode >> 16) & 0x0F].I & (~value);  \
1065
-    reg[dest].I = res;
998
+# define OP_BIC \
999
+	uint32_t res = reg[(opcode >> 16) & 0x0F].I & ~value; \
1000
+	reg[dest].I = res;
1066 1001
 #endif
1067 1002
 #ifndef OP_BICS
1068
- #define OP_BICS   OP_BIC C_CHECK_PC(C_SETCOND_LOGICAL)
1003
+# define OP_BICS OP_BIC C_CHECK_PC(C_SETCOND_LOGICAL)
1069 1004
 #endif
1070 1005
 #ifndef OP_MVN
1071
- #define OP_MVN \
1072
-    uint32_t res = ~value;                                   \
1073
-    reg[dest].I = res;
1006
+# define OP_MVN \
1007
+	uint32_t res = ~value; \
1008
+	reg[dest].I = res;
1074 1009
 #endif
1075 1010
 #ifndef OP_MVNS
1076
- #define OP_MVNS   OP_MVN C_CHECK_PC(C_SETCOND_LOGICAL)
1011
+# define OP_MVNS OP_MVN C_CHECK_PC(C_SETCOND_LOGICAL)
1077 1012
 #endif
1078 1013
 
1079 1014
 #ifndef SETCOND_NONE
1080
- #define SETCOND_NONE /*nothing*/
1015
+# define SETCOND_NONE /*nothing*/
1081 1016
 #endif
1082 1017
 #ifndef SETCOND_MUL
1083
- #define SETCOND_MUL \
1084
-     N_FLAG = ((int32_t)reg[dest].I < 0) ? true : false;    \
1085
-     Z_FLAG = reg[dest].I ? false : true;
1018
+# define SETCOND_MUL \
1019
+	N_FLAG = static_cast<int32_t>(reg[dest].I) < 0; \
1020
+	Z_FLAG = !reg[dest].I;
1086 1021
 #endif
1087 1022
 #ifndef SETCOND_MULL
1088
- #define SETCOND_MULL \
1089
-     N_FLAG = (reg[dest].I & 0x80000000) ? true : false;\
1090
-     Z_FLAG = reg[dest].I || reg[acc].I ? false : true;
1023
+# define SETCOND_MULL \
1024
+	N_FLAG = !!(reg[dest].I & 0x80000000); \
1025
+	Z_FLAG = !(reg[dest].I || reg[acc].I);
1091 1026
 #endif
1092 1027
 
1093 1028
 #ifndef ALU_FINISH
1094
- #define ALU_FINISH /*nothing*/
1029
+# define ALU_FINISH /*nothing*/
1095 1030
 #endif
1096 1031
 
1097 1032
 #ifndef ROR_IMM_MSR
1098
- #define ROR_IMM_MSR \
1099
-    uint32_t v = opcode & 0xff;                              \
1100
-    value = ((v << (32 - shift)) | (v >> shift));
1033
+# define ROR_IMM_MSR \
1034
+	uint32_t v = opcode & 0xff; \
1035
+	value = (v << (32 - shift)) | (v >> shift);
1101 1036
 #endif
1102 1037
 #ifndef ROR_OFFSET
1103
- #define ROR_OFFSET \
1104
-    offset = ((offset << (32 - shift)) | (offset >> shift));
1038
+# define ROR_OFFSET \
1039
+	offset = (offset << (32 - shift)) | (offset >> shift);
1105 1040
 #endif
1106 1041
 #ifndef RRX_OFFSET
1107
- #define RRX_OFFSET \
1108
-    offset = ((offset >> 1) | ((int)C_FLAG << 31));
1042
+# define RRX_OFFSET \
1043
+	offset = (offset >> 1) | (static_cast<int>(C_FLAG) << 31);
1109 1044
 #endif
1110 1045
 
1111 1046
 // ALU ops (except multiply) //////////////////////////////////////////////
... ...
@@ -1117,62 +1052,62 @@ static void count(uint32_t opcode, int cond_res)
1117 1052
 // ISREGSHIFT: 1 for insns of the form ...,Rn LSL/etc Rs; 0 otherwise
1118 1053
 // ALU_INIT, GETVALUE, OP, and ALU_FINISH are concatenated in order.
1119 1054
 #define ALU_INSN(ALU_INIT, GETVALUE, OP, MODECHANGE, ISREGSHIFT) \
1120
-    ALU_INIT GETVALUE OP ALU_FINISH;                            \
1121
-    if (LIKELY((opcode & 0x0000F000) != 0x0000F000)) {          \
1122
-        clockTicks = 1 + ISREGSHIFT                             \
1123
-                       + codeTicksAccessSeq32(armNextPC);       \
1124
-    } else {                                                    \
1125
-        MODECHANGE;                                             \
1126
-        if (armState) {                                         \
1127
-            reg[15].I &= 0xFFFFFFFC;                            \
1128
-            armNextPC = reg[15].I;                              \
1129
-            reg[15].I += 4;                                     \
1130
-            ARM_PREFETCH;                                       \
1131
-        } else {                                                \
1132
-            reg[15].I &= 0xFFFFFFFE;                            \
1133
-            armNextPC = reg[15].I;                              \
1134
-            reg[15].I += 2;                                     \
1135
-            THUMB_PREFETCH;                                     \
1136
-        }                                                       \
1137
-        clockTicks = 3 + ISREGSHIFT                             \
1138
-                       + codeTicksAccess32(armNextPC)           \
1139
-                       + codeTicksAccessSeq32(armNextPC)        \
1140
-                       + codeTicksAccessSeq32(armNextPC);       \
1141
-    }
1055
+	ALU_INIT GETVALUE OP ALU_FINISH; \
1056
+	if (LIKELY((opcode & 0x0000F000) != 0x0000F000)) \
1057
+		clockTicks = 1 + ISREGSHIFT + codeTicksAccessSeq32(armNextPC); \
1058
+	else \
1059
+	{ \
1060
+		MODECHANGE; \
1061
+		if (armState) \
1062
+		{ \
1063
+			reg[15].I &= 0xFFFFFFFC; \
1064
+			armNextPC = reg[15].I; \
1065
+			reg[15].I += 4; \
1066
+			ARM_PREFETCH(); \
1067
+		} \
1068
+		else \
1069
+		{ \
1070
+			reg[15].I &= 0xFFFFFFFE; \
1071
+			armNextPC = reg[15].I; \
1072
+			reg[15].I += 2; \
1073
+			THUMB_PREFETCH(); \
1074
+		} \
1075
+		clockTicks = 3 + ISREGSHIFT + codeTicksAccess32(armNextPC) + codeTicksAccessSeq32(armNextPC) + codeTicksAccessSeq32(armNextPC); \
1076
+	}
1142 1077
 
1143 1078
 #define MODECHANGE_NO  /*nothing*/
1144 1079
 #define MODECHANGE_YES CPUSwitchMode(reg[17].I & 0x1f, false);
1145 1080
 
1146 1081
 #define DEFINE_ALU_INSN_C(CODE1, CODE2, OP, MODECHANGE) \
1147
-  static INSN_REGPARM void arm##CODE1##0(uint32_t opcode) { ALU_INSN(ALU_INIT_C, VALUE_LSL_IMM_C, OP_##OP, MODECHANGE_##MODECHANGE, 0); }\
1148
-  static INSN_REGPARM void arm##CODE1##1(uint32_t opcode) { ALU_INSN(ALU_INIT_C, VALUE_LSL_REG_C, OP_##OP, MODECHANGE_##MODECHANGE, 1); }\
1149
-  static INSN_REGPARM void arm##CODE1##2(uint32_t opcode) { ALU_INSN(ALU_INIT_C, VALUE_LSR_IMM_C, OP_##OP, MODECHANGE_##MODECHANGE, 0); }\
1150
-  static INSN_REGPARM void arm##CODE1##3(uint32_t opcode) { ALU_INSN(ALU_INIT_C, VALUE_LSR_REG_C, OP_##OP, MODECHANGE_##MODECHANGE, 1); }\
1151
-  static INSN_REGPARM void arm##CODE1##4(uint32_t opcode) { ALU_INSN(ALU_INIT_C, VALUE_ASR_IMM_C, OP_##OP, MODECHANGE_##MODECHANGE, 0); }\
1152
-  static INSN_REGPARM void arm##CODE1##5(uint32_t opcode) { ALU_INSN(ALU_INIT_C, VALUE_ASR_REG_C, OP_##OP, MODECHANGE_##MODECHANGE, 1); }\
1153
-  static INSN_REGPARM void arm##CODE1##6(uint32_t opcode) { ALU_INSN(ALU_INIT_C, VALUE_ROR_IMM_C, OP_##OP, MODECHANGE_##MODECHANGE, 0); }\
1154
-  static INSN_REGPARM void arm##CODE1##7(uint32_t opcode) { ALU_INSN(ALU_INIT_C, VALUE_ROR_REG_C, OP_##OP, MODECHANGE_##MODECHANGE, 1); }\
1155
-  static INSN_REGPARM void arm##CODE2##0(uint32_t opcode) { ALU_INSN(ALU_INIT_C, VALUE_IMM_C,     OP_##OP, MODECHANGE_##MODECHANGE, 0); }
1082
+	static INSN_REGPARM void arm##CODE1##0(uint32_t opcode) { ALU_INSN(ALU_INIT_C, VALUE_LSL_IMM_C, OP_##OP, MODECHANGE_##MODECHANGE, 0); } \
1083
+	static INSN_REGPARM void arm##CODE1##1(uint32_t opcode) { ALU_INSN(ALU_INIT_C, VALUE_LSL_REG_C, OP_##OP, MODECHANGE_##MODECHANGE, 1); } \
1084
+	static INSN_REGPARM void arm##CODE1##2(uint32_t opcode) { ALU_INSN(ALU_INIT_C, VALUE_LSR_IMM_C, OP_##OP, MODECHANGE_##MODECHANGE, 0); } \
1085
+	static INSN_REGPARM void arm##CODE1##3(uint32_t opcode) { ALU_INSN(ALU_INIT_C, VALUE_LSR_REG_C, OP_##OP, MODECHANGE_##MODECHANGE, 1); } \
1086
+	static INSN_REGPARM void arm##CODE1##4(uint32_t opcode) { ALU_INSN(ALU_INIT_C, VALUE_ASR_IMM_C, OP_##OP, MODECHANGE_##MODECHANGE, 0); } \
1087
+	static INSN_REGPARM void arm##CODE1##5(uint32_t opcode) { ALU_INSN(ALU_INIT_C, VALUE_ASR_REG_C, OP_##OP, MODECHANGE_##MODECHANGE, 1); } \
1088
+	static INSN_REGPARM void arm##CODE1##6(uint32_t opcode) { ALU_INSN(ALU_INIT_C, VALUE_ROR_IMM_C, OP_##OP, MODECHANGE_##MODECHANGE, 0); } \
1089
+	static INSN_REGPARM void arm##CODE1##7(uint32_t opcode) { ALU_INSN(ALU_INIT_C, VALUE_ROR_REG_C, OP_##OP, MODECHANGE_##MODECHANGE, 1); } \
1090
+	static INSN_REGPARM void arm##CODE2##0(uint32_t opcode) { ALU_INSN(ALU_INIT_C, VALUE_IMM_C, OP_##OP, MODECHANGE_##MODECHANGE, 0); }
1156 1091
 #define DEFINE_ALU_INSN_NC(CODE1, CODE2, OP, MODECHANGE) \
1157
-  static INSN_REGPARM void arm##CODE1##0(uint32_t opcode) { ALU_INSN(ALU_INIT_NC, VALUE_LSL_IMM_NC, OP_##OP, MODECHANGE_##MODECHANGE, 0); }\
1158
-  static INSN_REGPARM void arm##CODE1##1(uint32_t opcode) { ALU_INSN(ALU_INIT_NC, VALUE_LSL_REG_NC, OP_##OP, MODECHANGE_##MODECHANGE, 1); }\
1159
-  static INSN_REGPARM void arm##CODE1##2(uint32_t opcode) { ALU_INSN(ALU_INIT_NC, VALUE_LSR_IMM_NC, OP_##OP, MODECHANGE_##MODECHANGE, 0); }\
1160
-  static INSN_REGPARM void arm##CODE1##3(uint32_t opcode) { ALU_INSN(ALU_INIT_NC, VALUE_LSR_REG_NC, OP_##OP, MODECHANGE_##MODECHANGE, 1); }\
1161
-  static INSN_REGPARM void arm##CODE1##4(uint32_t opcode) { ALU_INSN(ALU_INIT_NC, VALUE_ASR_IMM_NC, OP_##OP, MODECHANGE_##MODECHANGE, 0); }\
1162
-  static INSN_REGPARM void arm##CODE1##5(uint32_t opcode) { ALU_INSN(ALU_INIT_NC, VALUE_ASR_REG_NC, OP_##OP, MODECHANGE_##MODECHANGE, 1); }\
1163
-  static INSN_REGPARM void arm##CODE1##6(uint32_t opcode) { ALU_INSN(ALU_INIT_NC, VALUE_ROR_IMM_NC, OP_##OP, MODECHANGE_##MODECHANGE, 0); }\
1164
-  static INSN_REGPARM void arm##CODE1##7(uint32_t opcode) { ALU_INSN(ALU_INIT_NC, VALUE_ROR_REG_NC, OP_##OP, MODECHANGE_##MODECHANGE, 1); }\
1165
-  static INSN_REGPARM void arm##CODE2##0(uint32_t opcode) { ALU_INSN(ALU_INIT_NC, VALUE_IMM_NC,     OP_##OP, MODECHANGE_##MODECHANGE, 0); }
1092
+	static INSN_REGPARM void arm##CODE1##0(uint32_t opcode) { ALU_INSN(ALU_INIT_NC, VALUE_LSL_IMM_NC, OP_##OP, MODECHANGE_##MODECHANGE, 0); } \
1093
+	static INSN_REGPARM void arm##CODE1##1(uint32_t opcode) { ALU_INSN(ALU_INIT_NC, VALUE_LSL_REG_NC, OP_##OP, MODECHANGE_##MODECHANGE, 1); } \
1094
+	static INSN_REGPARM void arm##CODE1##2(uint32_t opcode) { ALU_INSN(ALU_INIT_NC, VALUE_LSR_IMM_NC, OP_##OP, MODECHANGE_##MODECHANGE, 0); } \
1095
+	static INSN_REGPARM void arm##CODE1##3(uint32_t opcode) { ALU_INSN(ALU_INIT_NC, VALUE_LSR_REG_NC, OP_##OP, MODECHANGE_##MODECHANGE, 1); } \
1096
+	static INSN_REGPARM void arm##CODE1##4(uint32_t opcode) { ALU_INSN(ALU_INIT_NC, VALUE_ASR_IMM_NC, OP_##OP, MODECHANGE_##MODECHANGE, 0); } \
1097
+	static INSN_REGPARM void arm##CODE1##5(uint32_t opcode) { ALU_INSN(ALU_INIT_NC, VALUE_ASR_REG_NC, OP_##OP, MODECHANGE_##MODECHANGE, 1); } \
1098
+	static INSN_REGPARM void arm##CODE1##6(uint32_t opcode) { ALU_INSN(ALU_INIT_NC, VALUE_ROR_IMM_NC, OP_##OP, MODECHANGE_##MODECHANGE, 0); } \
1099
+	static INSN_REGPARM void arm##CODE1##7(uint32_t opcode) { ALU_INSN(ALU_INIT_NC, VALUE_ROR_REG_NC, OP_##OP, MODECHANGE_##MODECHANGE, 1); } \
1100
+	static INSN_REGPARM void arm##CODE2##0(uint32_t opcode) { ALU_INSN(ALU_INIT_NC, VALUE_IMM_NC, OP_##OP, MODECHANGE_##MODECHANGE, 0); }
1166 1101
 
1167 1102
 // AND
1168 1103
 DEFINE_ALU_INSN_NC(00, 20, AND,  NO)
1169 1104
 // ANDS
1170
-DEFINE_ALU_INSN_C (01, 21, ANDS, YES)
1105
+DEFINE_ALU_INSN_C(01, 21, ANDS, YES)
1171 1106
 
1172 1107
 // EOR
1173 1108
 DEFINE_ALU_INSN_NC(02, 22, EOR,  NO)
1174 1109
 // EORS
1175
-DEFINE_ALU_INSN_C (03, 23, EORS, YES)
1110
+DEFINE_ALU_INSN_C(03, 23, EORS, YES)
1176 1111
 
1177 1112
 // SUB
1178 1113
 DEFINE_ALU_INSN_NC(04, 24, SUB,  NO)
... ...
@@ -1205,10 +1140,10 @@ DEFINE_ALU_INSN_NC(0E, 2E, RSC,  NO)
1205 1140
 DEFINE_ALU_INSN_NC(0F, 2F, RSCS, YES)
1206 1141
 
1207 1142
 // TST
1208
-DEFINE_ALU_INSN_C (11, 31, TST,  NO)
1143
+DEFINE_ALU_INSN_C(11, 31, TST,  NO)
1209 1144
 
1210 1145
 // TEQ
1211
-DEFINE_ALU_INSN_C (13, 33, TEQ,  NO)
1146
+DEFINE_ALU_INSN_C(13, 33, TEQ,  NO)
1212 1147
 
1213 1148
 // CMP
1214 1149
 DEFINE_ALU_INSN_NC(15, 35, CMP,  NO)
... ...
@@ -1219,22 +1154,22 @@ DEFINE_ALU_INSN_NC(17, 37, CMN,  NO)
1219 1154
 // ORR
1220 1155
 DEFINE_ALU_INSN_NC(18, 38, ORR,  NO)
1221 1156
 // ORRS
1222
-DEFINE_ALU_INSN_C (19, 39, ORRS, YES)
1157
+DEFINE_ALU_INSN_C(19, 39, ORRS, YES)
1223 1158
 
1224 1159
 // MOV
1225 1160
 DEFINE_ALU_INSN_NC(1A, 3A, MOV,  NO)
1226 1161
 // MOVS
1227
-DEFINE_ALU_INSN_C (1B, 3B, MOVS, YES)
1162
+DEFINE_ALU_INSN_C(1B, 3B, MOVS, YES)
1228 1163
 
1229 1164
 // BIC
1230 1165
 DEFINE_ALU_INSN_NC(1C, 3C, BIC,  NO)
1231 1166
 // BICS
1232
-DEFINE_ALU_INSN_C (1D, 3D, BICS, YES)
1167
+DEFINE_ALU_INSN_C(1D, 3D, BICS, YES)
1233 1168
 
1234 1169
 // MVN
1235 1170
 DEFINE_ALU_INSN_NC(1E, 3E, MVN,  NO)
1236 1171
 // MVNS
1237
-DEFINE_ALU_INSN_C (1F, 3F, MVNS, YES)
1172
+DEFINE_ALU_INSN_C(1F, 3F, MVNS, YES)
1238 1173
 
1239 1174
 // Multiply instructions //////////////////////////////////////////////////
1240 1175
 
... ...
@@ -1242,41 +1177,38 @@ DEFINE_ALU_INSN_C (1F, 3F, MVNS, YES)
1242 1177
 // SETCOND: SETCOND_NONE, SETCOND_MUL, or SETCOND_MULL
1243 1178
 // CYCLES: base cycle count (1, 2, or 3)
1244 1179
 #define MUL_INSN(OP, SETCOND, CYCLES) \
1245
-    int mult = (opcode & 0x0F);                         \
1246
-    uint32_t rs = reg[(opcode >> 8) & 0x0F].I;               \
1247
-    int acc = (opcode >> 12) & 0x0F;   /* or destLo */  \
1248
-    int dest = (opcode >> 16) & 0x0F;  /* or destHi */  \
1249
-    OP;                                                 \
1250
-    SETCOND;                                            \
1251
-    if ((int32_t)rs < 0)                                    \
1252
-        rs = ~rs;                                       \
1253
-    if ((rs & 0xFFFFFF00) == 0)                         \
1254
-        clockTicks += 0;                                \
1255
-    else if ((rs & 0xFFFF0000) == 0)                    \
1256
-        clockTicks += 1;                                \
1257
-    else if ((rs & 0xFF000000) == 0)                    \
1258
-        clockTicks += 2;                                \
1259
-    else                                                \
1260
-        clockTicks += 3;                                \
1261
-    if (busPrefetchCount == 0)                          \
1262
-        busPrefetchCount = ((busPrefetchCount+1)<<clockTicks) - 1; \
1263
-    clockTicks += 1 + codeTicksAccess32(armNextPC);
1180
+	int mult = opcode & 0x0F; \
1181
+	uint32_t rs = reg[(opcode >> 8) & 0x0F].I; \
1182
+	int acc = (opcode >> 12) & 0x0F; /* or destLo */ \
1183
+	int dest = (opcode >> 16) & 0x0F; /* or destHi */ \
1184
+	OP; \
1185
+	SETCOND; \
1186
+	if (static_cast<int32_t>(rs) < 0) \
1187
+		rs = ~rs; \
1188
+	if (!(rs & 0xFFFFFF00)) \
1189
+		; /* No-op */ \
1190
+	else if (!(rs & 0xFFFF0000)) \
1191
+		clockTicks += 1; \
1192
+	else if (!(rs & 0xFF000000)) \
1193
+		clockTicks += 2; \
1194
+	else \
1195
+		clockTicks += 3; \
1196
+	if (!busPrefetchCount) \
1197
+		busPrefetchCount = ((busPrefetchCount + 1) << clockTicks) - 1; \
1198
+	clockTicks += 1 + codeTicksAccess32(armNextPC);
1264 1199
 
1265 1200
 #define OP_MUL \
1266
-    reg[dest].I = reg[mult].I * rs;
1201
+	reg[dest].I = reg[mult].I * rs;
1267 1202
 #define OP_MLA \
1268
-    reg[dest].I = reg[mult].I * rs + reg[acc].I;
1203
+	reg[dest].I = reg[mult].I * rs + reg[acc].I;
1269 1204
 #define OP_MULL(SIGN) \
1270
-    SIGN##64_t res = (SIGN##64_t)(SIGN##32_t)reg[mult].I      \
1271
-                 * (SIGN##64_t)(SIGN##32_t)rs;              \
1272
-    reg[acc].I = (uint32_t)res;                              \
1273
-    reg[dest].I = (uint32_t)(res >> 32);
1205
+	SIGN##64_t res = static_cast<SIGN##64_t>(reg[mult].I) * static_cast<SIGN##64_t>(rs); \
1206
+	reg[acc].I = static_cast<uint32_t>(res); \
1207
+	reg[dest].I = static_cast<uint32_t>(res >> 32);
1274 1208
 #define OP_MLAL(SIGN) \
1275
-    SIGN##64_t res = ((SIGN##64_t)reg[dest].I<<32 | reg[acc].I)\
1276
-                 + ((SIGN##64_t)(SIGN##32_t)reg[mult].I     \
1277
-                    * (SIGN##64_t)(SIGN##32_t)rs);          \
1278
-    reg[acc].I = (uint32_t)res;                              \
1279
-    reg[dest].I = (uint32_t)(res >> 32);
1209
+	SIGN##64_t res = (static_cast<SIGN##64_t>(reg[dest].I) << 32 | reg[acc].I) + (static_cast<SIGN##64_t>(reg[mult].I) * static_cast<SIGN##64_t>(rs)); \
1210
+	reg[acc].I = static_cast<uint32_t>(res); \
1211
+	reg[dest].I = static_cast<uint32_t>(res >> 32);
1280 1212
 #define OP_UMULL OP_MULL(uint)
1281 1213
 #define OP_UMLAL OP_MLAL(uint)
1282 1214
 #define OP_SMULL OP_MULL(int)
... ...
@@ -1317,291 +1249,302 @@ static INSN_REGPARM void arm0F9(uint32_t opcode) { MUL_INSN(OP_SMLAL, SETCOND_MU
1317 1249
 // SWP Rd, Rm, [Rn]
1318 1250
 static INSN_REGPARM void arm109(uint32_t opcode)
1319 1251
 {
1320
-    uint32_t address = reg[(opcode >> 16) & 15].I;
1321
-    uint32_t temp = CPUReadMemory(address);
1322
-    CPUWriteMemory(address, reg[opcode&15].I);
1323
-    reg[(opcode >> 12) & 15].I = temp;
1324
-    clockTicks = 4 + dataTicksAccess32(address) + dataTicksAccess32(address)
1325
-                   + codeTicksAccess32(armNextPC);
1252
+	uint32_t address = reg[(opcode >> 16) & 15].I;
1253
+	uint32_t temp = CPUReadMemory(address);
1254
+	CPUWriteMemory(address, reg[opcode & 15].I);
1255
+	reg[(opcode >> 12) & 15].I = temp;
1256
+	clockTicks = 4 + dataTicksAccess32(address) + dataTicksAccess32(address) + codeTicksAccess32(armNextPC);
1326 1257
 }
1327 1258
 
1328 1259
 // SWPB Rd, Rm, [Rn]
1329 1260
 static INSN_REGPARM void arm149(uint32_t opcode)
1330 1261
 {
1331
-    uint32_t address = reg[(opcode >> 16) & 15].I;
1332
-    uint32_t temp = CPUReadByte(address);
1333
-    CPUWriteByte(address, reg[opcode&15].B.B0);
1334
-    reg[(opcode>>12)&15].I = temp;
1335
-    clockTicks = 4 + dataTicksAccess32(address) + dataTicksAccess32(address)
1336
-                   + codeTicksAccess32(armNextPC);
1262
+	uint32_t address = reg[(opcode >> 16) & 15].I;
1263
+	uint32_t temp = CPUReadByte(address);
1264
+	CPUWriteByte(address, reg[opcode&15].B.B0);
1265
+	reg[(opcode >> 12) & 15].I = temp;
1266
+	clockTicks = 4 + dataTicksAccess32(address) + dataTicksAccess32(address) + codeTicksAccess32(armNextPC);
1337 1267
 }
1338 1268
 
1339 1269
 // MRS Rd, CPSR
1340 1270
 static INSN_REGPARM void arm100(uint32_t opcode)
1341 1271
 {
1342
-    if (LIKELY((opcode & 0x0FFF0FFF) == 0x010F0000)) {
1343
-        CPUUpdateCPSR();
1344
-        reg[(opcode >> 12) & 0x0F].I = reg[16].I;
1345
-    } else {
1346
-        armUnknownInsn(opcode);
1347
-    }
1272
+	if (LIKELY((opcode & 0x0FFF0FFF) == 0x010F0000))
1273
+	{
1274
+		CPUUpdateCPSR();
1275
+		reg[(opcode >> 12) & 0x0F].I = reg[16].I;
1276
+	}
1277
+	else
1278
+		armUnknownInsn(opcode);
1348 1279
 }
1349 1280
 
1350 1281
 // MRS Rd, SPSR
1351 1282
 static INSN_REGPARM void arm140(uint32_t opcode)
1352 1283
 {
1353
-    if (LIKELY((opcode & 0x0FFF0FFF) == 0x014F0000)) {
1354
-        reg[(opcode >> 12) & 0x0F].I = reg[17].I;
1355
-    } else {
1356
-        armUnknownInsn(opcode);
1357
-    }
1284
+	if (LIKELY((opcode & 0x0FFF0FFF) == 0x014F0000))
1285
+		reg[(opcode >> 12) & 0x0F].I = reg[17].I;
1286
+	else
1287
+		armUnknownInsn(opcode);
1358 1288
 }
1359 1289
 
1360 1290
 // MSR CPSR_fields, Rm
1361 1291
 static INSN_REGPARM void arm120(uint32_t opcode)
1362 1292
 {
1363
-    if (LIKELY((opcode & 0x0FF0FFF0) == 0x0120F000)) {
1364
-        CPUUpdateCPSR();
1365
-        uint32_t value = reg[opcode & 15].I;
1366
-        uint32_t newValue = reg[16].I;
1367
-        if (armMode > 0x10) {
1368
-            if (opcode & 0x00010000)
1369
-                newValue = (newValue & 0xFFFFFF00) | (value & 0x000000FF);
1370
-            if (opcode & 0x00020000)
1371
-                newValue = (newValue & 0xFFFF00FF) | (value & 0x0000FF00);
1372
-            if (opcode & 0x00040000)
1373
-                newValue = (newValue & 0xFF00FFFF) | (value & 0x00FF0000);
1374
-        }
1375
-        if (opcode & 0x00080000)
1376
-            newValue = (newValue & 0x00FFFFFF) | (value & 0xFF000000);
1377
-        newValue |= 0x10;
1378
-        CPUSwitchMode(newValue & 0x1F, false);
1379
-        reg[16].I = newValue;
1380
-        CPUUpdateFlags();
1381
-        if (!armState) {  // this should not be allowed, but it seems to work
1382
-            THUMB_PREFETCH;
1383
-            reg[15].I = armNextPC + 2;
1384
-        }
1385
-    } else {
1386
-        armUnknownInsn(opcode);
1387
-    }
1293
+	if (LIKELY((opcode & 0x0FF0FFF0) == 0x0120F000))
1294
+	{
1295
+		CPUUpdateCPSR();
1296
+		uint32_t value = reg[opcode & 15].I;
1297
+		uint32_t newValue = reg[16].I;
1298
+		if (armMode > 0x10)
1299
+		{
1300
+			if (opcode & 0x00010000)
1301
+				newValue = (newValue & 0xFFFFFF00) | (value & 0x000000FF);
1302
+			if (opcode & 0x00020000)
1303
+				newValue = (newValue & 0xFFFF00FF) | (value & 0x0000FF00);
1304
+			if (opcode & 0x00040000)
1305
+				newValue = (newValue & 0xFF00FFFF) | (value & 0x00FF0000);
1306
+		}
1307
+		if (opcode & 0x00080000)
1308
+			newValue = (newValue & 0x00FFFFFF) | (value & 0xFF000000);
1309
+		newValue |= 0x10;
1310
+		CPUSwitchMode(newValue & 0x1F, false);
1311
+		reg[16].I = newValue;
1312
+		CPUUpdateFlags();
1313
+		if (!armState) // this should not be allowed, but it seems to work
1314
+		{
1315
+			THUMB_PREFETCH();
1316
+			reg[15].I = armNextPC + 2;
1317
+		}
1318
+	}
1319
+	else
1320
+		armUnknownInsn(opcode);
1388 1321
 }
1389 1322
 
1390 1323
 // MSR SPSR_fields, Rm
1391 1324
 static INSN_REGPARM void arm160(uint32_t opcode)
1392 1325
 {
1393
-    if (LIKELY((opcode & 0x0FF0FFF0) == 0x0160F000)) {
1394
-        uint32_t value = reg[opcode & 15].I;
1395
-        if (armMode > 0x10 && armMode < 0x1F) {
1396
-            if (opcode & 0x00010000)
1397
-                reg[17].I = (reg[17].I & 0xFFFFFF00) | (value & 0x000000FF);
1398
-            if (opcode & 0x00020000)
1399
-                reg[17].I = (reg[17].I & 0xFFFF00FF) | (value & 0x0000FF00);
1400
-            if (opcode & 0x00040000)
1401
-                reg[17].I = (reg[17].I & 0xFF00FFFF) | (value & 0x00FF0000);
1402
-            if (opcode & 0x00080000)
1403
-                reg[17].I = (reg[17].I & 0x00FFFFFF) | (value & 0xFF000000);
1404
-        }
1405
-    } else {
1406
-        armUnknownInsn(opcode);
1407
-    }
1326
+	if (LIKELY((opcode & 0x0FF0FFF0) == 0x0160F000))
1327
+	{
1328
+		uint32_t value = reg[opcode & 15].I;
1329
+		if (armMode > 0x10 && armMode < 0x1F)
1330
+		{
1331
+			if (opcode & 0x00010000)
1332
+				reg[17].I = (reg[17].I & 0xFFFFFF00) | (value & 0x000000FF);
1333
+			if (opcode & 0x00020000)
1334
+				reg[17].I = (reg[17].I & 0xFFFF00FF) | (value & 0x0000FF00);
1335
+			if (opcode & 0x00040000)
1336
+				reg[17].I = (reg[17].I & 0xFF00FFFF) | (value & 0x00FF0000);
1337
+			if (opcode & 0x00080000)
1338
+				reg[17].I = (reg[17].I & 0x00FFFFFF) | (value & 0xFF000000);
1339
+		}
1340
+	}
1341
+	else
1342
+		armUnknownInsn(opcode);
1408 1343
 }
1409 1344
 
1410 1345
 // MSR CPSR_fields, #
1411 1346
 static INSN_REGPARM void arm320(uint32_t opcode)
1412 1347
 {
1413
-    if (LIKELY((opcode & 0x0FF0F000) == 0x0320F000)) {
1414
-        CPUUpdateCPSR();
1415
-        uint32_t value = opcode & 0xFF;
1416
-        int shift = (opcode & 0xF00) >> 7;
1417
-        if (shift) {
1418
-            ROR_IMM_MSR;
1419
-        }
1420
-        uint32_t newValue = reg[16].I;
1421
-        if (armMode > 0x10) {
1422
-            if (opcode & 0x00010000)
1423
-                newValue = (newValue & 0xFFFFFF00) | (value & 0x000000FF);
1424
-            if (opcode & 0x00020000)
1425
-                newValue = (newValue & 0xFFFF00FF) | (value & 0x0000FF00);
1426
-            if (opcode & 0x00040000)
1427
-                newValue = (newValue & 0xFF00FFFF) | (value & 0x00FF0000);
1428
-        }
1429
-        if (opcode & 0x00080000)
1430
-            newValue = (newValue & 0x00FFFFFF) | (value & 0xFF000000);
1431
-
1432
-        newValue |= 0x10;
1433
-
1434
-        CPUSwitchMode(newValue & 0x1F, false);
1435
-        reg[16].I = newValue;
1436
-        CPUUpdateFlags();
1437
-        if (!armState) {  // this should not be allowed, but it seems to work
1438
-            THUMB_PREFETCH;
1439
-            reg[15].I = armNextPC + 2;
1440
-        }
1441
-    } else {
1442
-        armUnknownInsn(opcode);
1443
-    }
1348
+	if (LIKELY((opcode & 0x0FF0F000) == 0x0320F000))
1349
+	{
1350
+		CPUUpdateCPSR();
1351
+		uint32_t value = opcode & 0xFF;
1352
+		int shift = (opcode & 0xF00) >> 7;
1353
+		if (shift)
1354
+		{
1355
+			ROR_IMM_MSR;
1356
+		}
1357
+		uint32_t newValue = reg[16].I;
1358
+		if (armMode > 0x10)
1359
+		{
1360
+			if (opcode & 0x00010000)
1361
+				newValue = (newValue & 0xFFFFFF00) | (value & 0x000000FF);
1362
+			if (opcode & 0x00020000)
1363
+				newValue = (newValue & 0xFFFF00FF) | (value & 0x0000FF00);
1364
+			if (opcode & 0x00040000)
1365
+				newValue = (newValue & 0xFF00FFFF) | (value & 0x00FF0000);
1366
+		}
1367
+		if (opcode & 0x00080000)
1368
+			newValue = (newValue & 0x00FFFFFF) | (value & 0xFF000000);
1369
+
1370
+		newValue |= 0x10;
1371
+
1372
+		CPUSwitchMode(newValue & 0x1F, false);
1373
+		reg[16].I = newValue;
1374
+		CPUUpdateFlags();
1375
+		if (!armState) // this should not be allowed, but it seems to work
1376
+		{
1377
+			THUMB_PREFETCH();
1378
+			reg[15].I = armNextPC + 2;
1379
+		}
1380
+	}
1381
+	else
1382
+		armUnknownInsn(opcode);
1444 1383
 }
1445 1384
 
1446 1385
 // MSR SPSR_fields, #
1447 1386
 static INSN_REGPARM void arm360(uint32_t opcode)
1448 1387
 {
1449
-    if (LIKELY((opcode & 0x0FF0F000) == 0x0360F000)) {
1450
-        if (armMode > 0x10 && armMode < 0x1F) {
1451
-            uint32_t value = opcode & 0xFF;
1452
-            int shift = (opcode & 0xF00) >> 7;
1453
-            if (shift) {
1454
-                ROR_IMM_MSR;
1455
-            }
1456
-            if (opcode & 0x00010000)
1457
-                reg[17].I = (reg[17].I & 0xFFFFFF00) | (value & 0x000000FF);
1458
-            if (opcode & 0x00020000)
1459
-                reg[17].I = (reg[17].I & 0xFFFF00FF) | (value & 0x0000FF00);
1460
-            if (opcode & 0x00040000)
1461
-                reg[17].I = (reg[17].I & 0xFF00FFFF) | (value & 0x00FF0000);
1462
-            if (opcode & 0x00080000)
1463
-                reg[17].I = (reg[17].I & 0x00FFFFFF) | (value & 0xFF000000);
1464
-        }
1465
-    } else {
1466
-        armUnknownInsn(opcode);
1467
-    }
1388
+	if (LIKELY((opcode & 0x0FF0F000) == 0x0360F000))
1389
+	{
1390
+		if (armMode > 0x10 && armMode < 0x1F)
1391
+		{
1392
+			uint32_t value = opcode & 0xFF;
1393
+			int shift = (opcode & 0xF00) >> 7;
1394
+			if (shift)
1395
+			{
1396
+				ROR_IMM_MSR;
1397
+			}
1398
+			if (opcode & 0x00010000)
1399
+				reg[17].I = (reg[17].I & 0xFFFFFF00) | (value & 0x000000FF);
1400
+			if (opcode & 0x00020000)
1401
+				reg[17].I = (reg[17].I & 0xFFFF00FF) | (value & 0x0000FF00);
1402
+			if (opcode & 0x00040000)
1403
+				reg[17].I = (reg[17].I & 0xFF00FFFF) | (value & 0x00FF0000);
1404
+			if (opcode & 0x00080000)
1405
+				reg[17].I = (reg[17].I & 0x00FFFFFF) | (value & 0xFF000000);
1406
+		}
1407
+	}
1408
+	else
1409
+		armUnknownInsn(opcode);
1468 1410
 }
1469 1411
 
1470 1412
 // BX Rm
1471 1413
 static INSN_REGPARM void arm121(uint32_t opcode)
1472 1414
 {
1473
-    if (LIKELY((opcode & 0x0FFFFFF0) == 0x012FFF10)) {
1474
-        int base = opcode & 0x0F;
1475
-        busPrefetchCount = 0;
1476
-        armState = reg[base].I & 1 ? false : true;
1477
-        if (armState) {
1478
-            reg[15].I = reg[base].I & 0xFFFFFFFC;
1479
-            armNextPC = reg[15].I;
1480
-            reg[15].I += 4;
1481
-            ARM_PREFETCH;
1482
-            clockTicks = 3 + codeTicksAccessSeq32(armNextPC)
1483
-                           + codeTicksAccessSeq32(armNextPC)
1484
-                           + codeTicksAccess32(armNextPC);
1485
-        } else {
1486
-            reg[15].I = reg[base].I & 0xFFFFFFFE;
1487
-            armNextPC = reg[15].I;
1488
-            reg[15].I += 2;
1489
-            THUMB_PREFETCH;
1490
-            clockTicks = 3 + codeTicksAccessSeq16(armNextPC)
1491
-                           + codeTicksAccessSeq16(armNextPC)
1492
-                           + codeTicksAccess16(armNextPC);
1493
-        }
1494
-    } else {
1495
-        armUnknownInsn(opcode);
1496
-    }
1415
+	if (LIKELY((opcode & 0x0FFFFFF0) == 0x012FFF10))
1416
+	{
1417
+		int base = opcode & 0x0F;
1418
+		busPrefetchCount = 0;
1419
+		armState = !(reg[base].I & 1);
1420
+		if (armState)
1421
+		{
1422
+			reg[15].I = reg[base].I & 0xFFFFFFFC;
1423
+			armNextPC = reg[15].I;
1424
+			reg[15].I += 4;
1425
+			ARM_PREFETCH();
1426
+			clockTicks = 3 + codeTicksAccessSeq32(armNextPC) + codeTicksAccessSeq32(armNextPC) + codeTicksAccess32(armNextPC);
1427
+		}
1428
+		else
1429
+		{
1430
+			reg[15].I = reg[base].I & 0xFFFFFFFE;
1431
+			armNextPC = reg[15].I;
1432
+			reg[15].I += 2;
1433
+			THUMB_PREFETCH();
1434
+			clockTicks = 3 + codeTicksAccessSeq16(armNextPC) + codeTicksAccessSeq16(armNextPC) + codeTicksAccess16(armNextPC);
1435
+		}
1436
+	}
1437
+	else
1438
+		armUnknownInsn(opcode);
1497 1439
 }
1498 1440
 
1499 1441
 // Load/store /////////////////////////////////////////////////////////////
1500 1442
 
1501 1443
 #define OFFSET_IMM \
1502
-    int offset = opcode & 0xFFF;
1444
+	int offset = opcode & 0xFFF;
1503 1445
 #define OFFSET_IMM8 \
1504
-    int offset = ((opcode & 0x0F) | ((opcode>>4) & 0xF0));
1446
+	int offset = (opcode & 0x0F) | ((opcode >> 4) & 0xF0);
1505 1447
 #define OFFSET_REG \
1506
-    int offset = reg[opcode & 15].I;
1448
+	int offset = reg[opcode & 15].I;
1507 1449
 #define OFFSET_LSL \
1508
-    int offset = reg[opcode & 15].I << ((opcode>>7) & 31);
1450
+	int offset = reg[opcode & 15].I << ((opcode >> 7) & 31);
1509 1451
 #define OFFSET_LSR \
1510
-    int shift = (opcode >> 7) & 31;                     \
1511
-    int offset = shift ? reg[opcode & 15].I >> shift : 0;
1452
+	int shift = (opcode >> 7) & 31; \
1453
+	int offset = shift ? reg[opcode & 15].I >> shift : 0;
1512 1454
 #define OFFSET_ASR \
1513
-    int shift = (opcode >> 7) & 31;                     \
1514
-    int offset;                                         \
1515
-    if (shift)                                          \
1516
-        offset = (int)((int32_t)reg[opcode & 15].I >> shift);\
1517
-    else if (reg[opcode & 15].I & 0x80000000)           \
1518
-        offset = 0xFFFFFFFF;                            \
1519
-    else                                                \
1520
-        offset = 0;
1455
+	int shift = (opcode >> 7) & 31; \
1456
+	int offset; \
1457
+	if (shift) \
1458
+		offset = static_cast<int>(static_cast<int32_t>(reg[opcode & 15].I) >> shift); \
1459
+	else if (reg[opcode & 15].I & 0x80000000) \
1460
+		offset = 0xFFFFFFFF; \
1461
+	else \
1462
+		offset = 0;
1521 1463
 #define OFFSET_ROR \
1522
-    int shift = (opcode >> 7) & 31;                     \
1523
-    uint32_t offset = reg[opcode & 15].I;                    \
1524
-    if (shift) {                                        \
1525
-        ROR_OFFSET;                                     \
1526
-    } else {                                            \
1527
-        RRX_OFFSET;                                     \
1528
-    }
1464
+	int shift = (opcode >> 7) & 31; \
1465
+	uint32_t offset = reg[opcode & 15].I; \
1466
+	if (shift) \
1467
+	{ \
1468
+		ROR_OFFSET; \
1469
+	} \
1470
+	else \
1471
+	{ \
1472
+		RRX_OFFSET; \
1473
+	}
1529 1474
 
1530 1475
 #define ADDRESS_POST (reg[base].I)
1531 1476
 #define ADDRESS_PREDEC (reg[base].I - offset)
1532 1477
 #define ADDRESS_PREINC (reg[base].I + offset)
1533 1478
 
1534
-#define OP_STR    CPUWriteMemory(address, reg[dest].I)
1535
-#define OP_STRH   CPUWriteHalfWord(address, reg[dest].W.W0)
1536
-#define OP_STRB   CPUWriteByte(address, reg[dest].B.B0)
1537
-#define OP_LDR    reg[dest].I = CPUReadMemory(address)
1538
-#define OP_LDRH   reg[dest].I = CPUReadHalfWord(address)
1539
-#define OP_LDRB   reg[dest].I = CPUReadByte(address)
1540
-#define OP_LDRSH  reg[dest].I = (uint32_t)CPUReadHalfWordSigned(address)
1541
-#define OP_LDRSB  reg[dest].I = (int8_t)CPUReadByte(address)
1479
+#define OP_STR CPUWriteMemory(address, reg[dest].I)
1480
+#define OP_STRH CPUWriteHalfWord(address, reg[dest].W.W0)
1481
+#define OP_STRB CPUWriteByte(address, reg[dest].B.B0)
1482
+#define OP_LDR reg[dest].I = CPUReadMemory(address)
1483
+#define OP_LDRH reg[dest].I = CPUReadHalfWord(address)
1484
+#define OP_LDRB reg[dest].I = CPUReadByte(address)
1485
+#define OP_LDRSH reg[dest].I = static_cast<uint32_t>(CPUReadHalfWordSigned(address))
1486
+#define OP_LDRSB reg[dest].I = static_cast<int8_t>(CPUReadByte(address))
1542 1487
 
1543
-#define WRITEBACK_NONE     /*nothing*/
1544
-#define WRITEBACK_PRE      reg[base].I = address
1545
-#define WRITEBACK_POSTDEC  reg[base].I = address - offset
1546
-#define WRITEBACK_POSTINC  reg[base].I = address + offset
1488
+#define WRITEBACK_NONE /*nothing*/
1489
+#define WRITEBACK_PRE reg[base].I = address
1490
+#define WRITEBACK_POSTDEC reg[base].I = address - offset
1491
+#define WRITEBACK_POSTINC reg[base].I = address + offset
1547 1492
 
1548 1493
 #define LDRSTR_INIT(CALC_OFFSET, CALC_ADDRESS) \
1549
-    if (busPrefetchCount == 0)                          \
1550
-        busPrefetch = busPrefetchEnable;                \
1551
-    int dest = (opcode >> 12) & 15;                     \
1552
-    int base = (opcode >> 16) & 15;                     \
1553
-    CALC_OFFSET;                                        \
1554
-    uint32_t address = CALC_ADDRESS;
1494
+	if (!busPrefetchCount) \
1495
+		busPrefetch = busPrefetchEnable; \
1496
+	int dest = (opcode >> 12) & 15; \
1497
+	int base = (opcode >> 16) & 15; \
1498
+	CALC_OFFSET; \
1499
+	uint32_t address = CALC_ADDRESS;
1555 1500
 
1556 1501
 #define STR(CALC_OFFSET, CALC_ADDRESS, STORE_DATA, WRITEBACK1, WRITEBACK2, SIZE) \
1557
-    LDRSTR_INIT(CALC_OFFSET, CALC_ADDRESS);             \
1558
-    WRITEBACK1;                                         \
1559
-    STORE_DATA;                                         \
1560
-    WRITEBACK2;                                         \
1561
-    clockTicks = 2 + dataTicksAccess##SIZE(address)     \
1562
-                   + codeTicksAccess32(armNextPC);
1502
+	LDRSTR_INIT(CALC_OFFSET, CALC_ADDRESS); \
1503
+	WRITEBACK1; \
1504
+	STORE_DATA; \
1505
+	WRITEBACK2; \
1506
+	clockTicks = 2 + dataTicksAccess##SIZE(address) + codeTicksAccess32(armNextPC);
1563 1507
 #define LDR(CALC_OFFSET, CALC_ADDRESS, LOAD_DATA, WRITEBACK, SIZE) \
1564
-    LDRSTR_INIT(CALC_OFFSET, CALC_ADDRESS);             \
1565
-    LOAD_DATA;                                          \
1566
-    if (dest != base)                                   \
1567
-    {                                                   \
1568
-        WRITEBACK;                                      \
1569
-    }                                                   \
1570
-    clockTicks = 0;                                     \
1571
-    if (dest == 15) {                                   \
1572
-        reg[15].I &= 0xFFFFFFFC;                        \
1573
-        armNextPC = reg[15].I;                          \
1574
-        reg[15].I += 4;                                 \
1575
-        ARM_PREFETCH;                                   \
1576
-        clockTicks += 2 + dataTicksAccessSeq32(address) \
1577
-                        + dataTicksAccessSeq32(address);\
1578
-    }                                                   \
1579
-    clockTicks += 3 + dataTicksAccess##SIZE(address)    \
1580
-                    + codeTicksAccess32(armNextPC);
1508
+	LDRSTR_INIT(CALC_OFFSET, CALC_ADDRESS); \
1509
+	LOAD_DATA; \
1510
+	if (dest != base) \
1511
+	{ \
1512
+		WRITEBACK; \
1513
+	} \
1514
+	clockTicks = 0; \
1515
+	if (dest == 15) \
1516
+	{ \
1517
+		reg[15].I &= 0xFFFFFFFC; \
1518
+		armNextPC = reg[15].I; \
1519
+		reg[15].I += 4; \
1520
+		ARM_PREFETCH(); \
1521
+		clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); \
1522
+	} \
1523
+	clockTicks += 3 + dataTicksAccess##SIZE(address) + codeTicksAccess32(armNextPC);
1581 1524
 #define STR_POSTDEC(CALC_OFFSET, STORE_DATA, SIZE) \
1582
-  STR(CALC_OFFSET, ADDRESS_POST, STORE_DATA, WRITEBACK_NONE, WRITEBACK_POSTDEC, SIZE)
1525
+	STR(CALC_OFFSET, ADDRESS_POST, STORE_DATA, WRITEBACK_NONE, WRITEBACK_POSTDEC, SIZE)
1583 1526
 #define STR_POSTINC(CALC_OFFSET, STORE_DATA, SIZE) \
1584
-  STR(CALC_OFFSET, ADDRESS_POST, STORE_DATA, WRITEBACK_NONE, WRITEBACK_POSTINC, SIZE)
1527
+	STR(CALC_OFFSET, ADDRESS_POST, STORE_DATA, WRITEBACK_NONE, WRITEBACK_POSTINC, SIZE)
1585 1528
 #define STR_PREDEC(CALC_OFFSET, STORE_DATA, SIZE) \
1586
-  STR(CALC_OFFSET, ADDRESS_PREDEC, STORE_DATA, WRITEBACK_NONE, WRITEBACK_NONE, SIZE)
1529
+	STR(CALC_OFFSET, ADDRESS_PREDEC, STORE_DATA, WRITEBACK_NONE, WRITEBACK_NONE, SIZE)
1587 1530
 #define STR_PREDEC_WB(CALC_OFFSET, STORE_DATA, SIZE) \
1588
-  STR(CALC_OFFSET, ADDRESS_PREDEC, STORE_DATA, WRITEBACK_PRE, WRITEBACK_NONE, SIZE)
1531
+	STR(CALC_OFFSET, ADDRESS_PREDEC, STORE_DATA, WRITEBACK_PRE, WRITEBACK_NONE, SIZE)
1589 1532
 #define STR_PREINC(CALC_OFFSET, STORE_DATA, SIZE) \
1590
-  STR(CALC_OFFSET, ADDRESS_PREINC, STORE_DATA, WRITEBACK_NONE, WRITEBACK_NONE, SIZE)
1533
+	STR(CALC_OFFSET, ADDRESS_PREINC, STORE_DATA, WRITEBACK_NONE, WRITEBACK_NONE, SIZE)
1591 1534
 #define STR_PREINC_WB(CALC_OFFSET, STORE_DATA, SIZE) \
1592
-  STR(CALC_OFFSET, ADDRESS_PREINC, STORE_DATA, WRITEBACK_PRE, WRITEBACK_NONE, SIZE)
1535
+	STR(CALC_OFFSET, ADDRESS_PREINC, STORE_DATA, WRITEBACK_PRE, WRITEBACK_NONE, SIZE)
1593 1536
 #define LDR_POSTDEC(CALC_OFFSET, LOAD_DATA, SIZE) \
1594
-  LDR(CALC_OFFSET, ADDRESS_POST, LOAD_DATA, WRITEBACK_POSTDEC, SIZE)
1537
+	LDR(CALC_OFFSET, ADDRESS_POST, LOAD_DATA, WRITEBACK_POSTDEC, SIZE)
1595 1538
 #define LDR_POSTINC(CALC_OFFSET, LOAD_DATA, SIZE) \
1596
-  LDR(CALC_OFFSET, ADDRESS_POST, LOAD_DATA, WRITEBACK_POSTINC, SIZE)
1539
+	LDR(CALC_OFFSET, ADDRESS_POST, LOAD_DATA, WRITEBACK_POSTINC, SIZE)
1597 1540
 #define LDR_PREDEC(CALC_OFFSET, LOAD_DATA, SIZE) \
1598
-  LDR(CALC_OFFSET, ADDRESS_PREDEC, LOAD_DATA, WRITEBACK_NONE, SIZE)
1541
+	LDR(CALC_OFFSET, ADDRESS_PREDEC, LOAD_DATA, WRITEBACK_NONE, SIZE)
1599 1542
 #define LDR_PREDEC_WB(CALC_OFFSET, LOAD_DATA, SIZE) \
1600
-  LDR(CALC_OFFSET, ADDRESS_PREDEC, LOAD_DATA, WRITEBACK_PRE, SIZE)
1543
+	LDR(CALC_OFFSET, ADDRESS_PREDEC, LOAD_DATA, WRITEBACK_PRE, SIZE)
1601 1544
 #define LDR_PREINC(CALC_OFFSET, LOAD_DATA, SIZE) \
1602
-  LDR(CALC_OFFSET, ADDRESS_PREINC, LOAD_DATA, WRITEBACK_NONE, SIZE)
1545
+	LDR(CALC_OFFSET, ADDRESS_PREINC, LOAD_DATA, WRITEBACK_NONE, SIZE)
1603 1546
 #define LDR_PREINC_WB(CALC_OFFSET, LOAD_DATA, SIZE) \
1604
-  LDR(CALC_OFFSET, ADDRESS_PREINC, LOAD_DATA, WRITEBACK_PRE, SIZE)
1547
+	LDR(CALC_OFFSET, ADDRESS_PREINC, LOAD_DATA, WRITEBACK_PRE, SIZE)
1605 1548
 
1606 1549
 // STRH Rd, [Rn], -Rm
1607 1550
 static INSN_REGPARM void arm00B(uint32_t opcode) { STR_POSTDEC(OFFSET_REG, OP_STRH, 16); }
... ...
@@ -1948,655 +1891,649 @@ static INSN_REGPARM void arm7F6(uint32_t opcode) { LDR_PREINC_WB(OFFSET_ROR, OP_
1948 1891
 
1949 1892
 // STM/LDM ////////////////////////////////////////////////////////////////
1950 1893
 
1951
-#define STM_REG(bit,num) \
1952
-    if (opcode & (1U<<(bit))) {                         \
1953
-        CPUWriteMemory(address, reg[(num)].I);          \
1954
-        if (!count) {                                   \
1955
-            clockTicks += 1 + dataTicksAccess32(address);\
1956
-        } else {                                        \
1957
-            clockTicks += 1 + dataTicksAccessSeq32(address);\
1958
-        }                                               \
1959
-        count++;                                        \
1960
-        address += 4;                                   \
1961
-    }
1962
-#define STMW_REG(bit,num) \
1963
-    if (opcode & (1U<<(bit))) {                         \
1964
-        CPUWriteMemory(address, reg[(num)].I);          \
1965
-        if (!count) {                                   \
1966
-            clockTicks += 1 + dataTicksAccess32(address);\
1967
-        } else {                                        \
1968
-            clockTicks += 1 + dataTicksAccessSeq32(address);\
1969
-        }                                               \
1970
-        reg[base].I = temp;                             \
1971
-        count++;                                        \
1972
-        address += 4;                                   \
1973
-    }
1974
-#define LDM_REG(bit,num) \
1975
-    if (opcode & (1U<<(bit))) {                         \
1976
-        reg[(num)].I = CPUReadMemory(address);          \
1977
-        if (!count) {                                   \
1978
-            clockTicks += 1 + dataTicksAccess32(address);\
1979
-        } else {                                        \
1980
-            clockTicks += 1 + dataTicksAccessSeq32(address);\
1981
-        }                                               \
1982
-        count++;                                        \
1983
-        address += 4;                                   \
1984
-    }
1894
+#define STM_REG(bit, num) \
1895
+	if (opcode & (1U << (bit))) \
1896
+	{ \
1897
+		CPUWriteMemory(address, reg[(num)].I); \
1898
+		if (!count) \
1899
+			clockTicks += 1 + dataTicksAccess32(address); \
1900
+		else \
1901
+			clockTicks += 1 + dataTicksAccessSeq32(address); \
1902
+		++count; \
1903
+		address += 4; \
1904
+	}
1905
+#define STMW_REG(bit, num) \
1906
+	if (opcode & (1U << (bit))) \
1907
+	{ \
1908
+		CPUWriteMemory(address, reg[(num)].I); \
1909
+		if (!count) \
1910
+			clockTicks += 1 + dataTicksAccess32(address); \
1911
+		else \
1912
+			clockTicks += 1 + dataTicksAccessSeq32(address); \
1913
+		reg[base].I = temp; \
1914
+		++count; \
1915
+		address += 4; \
1916
+	}
1917
+#define LDM_REG(bit, num) \
1918
+	if (opcode & (1U << (bit))) \
1919
+	{ \
1920
+		reg[(num)].I = CPUReadMemory(address); \
1921
+		if (!count) \
1922
+			clockTicks += 1 + dataTicksAccess32(address); \
1923
+		else \
1924
+			clockTicks += 1 + dataTicksAccessSeq32(address); \
1925
+		++count; \
1926
+		address += 4; \
1927
+	}
1985 1928
 #define STM_LOW(STORE_REG) \
1986
-    STORE_REG(0, 0);                                    \
1987
-    STORE_REG(1, 1);                                    \
1988
-    STORE_REG(2, 2);                                    \
1989
-    STORE_REG(3, 3);                                    \
1990
-    STORE_REG(4, 4);                                    \
1991
-    STORE_REG(5, 5);                                    \
1992
-    STORE_REG(6, 6);                                    \
1993
-    STORE_REG(7, 7);
1929
+	STORE_REG(0, 0); \
1930
+	STORE_REG(1, 1); \
1931
+	STORE_REG(2, 2); \
1932
+	STORE_REG(3, 3); \
1933
+	STORE_REG(4, 4); \
1934
+	STORE_REG(5, 5); \
1935
+	STORE_REG(6, 6); \
1936
+	STORE_REG(7, 7);
1994 1937
 #define STM_HIGH(STORE_REG) \
1995
-    STORE_REG(8, 8);                                    \
1996
-    STORE_REG(9, 9);                                    \
1997
-    STORE_REG(10, 10);                                  \
1998
-    STORE_REG(11, 11);                                  \
1999
-    STORE_REG(12, 12);                                  \
2000
-    STORE_REG(13, 13);                                  \
2001
-    STORE_REG(14, 14);
1938
+	STORE_REG(8, 8); \
1939
+	STORE_REG(9, 9); \
1940
+	STORE_REG(10, 10); \
1941
+	STORE_REG(11, 11); \
1942
+	STORE_REG(12, 12); \
1943
+	STORE_REG(13, 13); \
1944
+	STORE_REG(14, 14);
2002 1945
 #define STM_HIGH_2(STORE_REG) \
2003
-    if (armMode == 0x11) {                              \
2004
-        STORE_REG(8, R8_FIQ);                           \
2005
-        STORE_REG(9, R9_FIQ);                           \
2006
-        STORE_REG(10, R10_FIQ);                         \
2007
-        STORE_REG(11, R11_FIQ);                         \
2008
-        STORE_REG(12, R12_FIQ);                         \
2009
-    } else {                                            \
2010
-        STORE_REG(8, 8);                                \
2011
-        STORE_REG(9, 9);                                \
2012
-        STORE_REG(10, 10);                              \
2013
-        STORE_REG(11, 11);                              \
2014
-        STORE_REG(12, 12);                              \
2015
-    }                                                   \
2016
-    if (armMode != 0x10 && armMode != 0x1F) {           \
2017
-        STORE_REG(13, R13_USR);                         \
2018
-        STORE_REG(14, R14_USR);                         \
2019
-    } else {                                            \
2020
-        STORE_REG(13, 13);                              \
2021
-        STORE_REG(14, 14);                              \
2022
-    }
1946
+	if (armMode == 0x11) \
1947
+	{ \
1948
+		STORE_REG(8, R8_FIQ); \
1949
+		STORE_REG(9, R9_FIQ); \
1950
+		STORE_REG(10, R10_FIQ); \
1951
+		STORE_REG(11, R11_FIQ); \
1952
+		STORE_REG(12, R12_FIQ); \
1953
+	} \
1954
+	else \
1955
+	{ \
1956
+		STORE_REG(8, 8); \
1957
+		STORE_REG(9, 9); \
1958
+		STORE_REG(10, 10); \
1959
+		STORE_REG(11, 11); \
1960
+		STORE_REG(12, 12); \
1961
+	} \
1962
+	if (armMode != 0x10 && armMode != 0x1F) \
1963
+	{ \
1964
+		STORE_REG(13, R13_USR); \
1965
+		STORE_REG(14, R14_USR); \
1966
+	} \
1967
+	else \
1968
+	{ \
1969
+		STORE_REG(13, 13); \
1970
+		STORE_REG(14, 14); \
1971
+	}
2023 1972
 #define STM_PC \
2024
-    if (opcode & (1U<<15)) {                            \
2025
-        CPUWriteMemory(address, reg[15].I+4);           \
2026
-        if (!count) {                                   \
2027
-            clockTicks += 1 + dataTicksAccess32(address);\
2028
-        } else {                                        \
2029
-            clockTicks += 1 + dataTicksAccessSeq32(address);\
2030
-        }                                               \
2031
-        count++;                                        \
2032
-    }
1973
+	if (opcode & (1U << 15)) \
1974
+	{ \
1975
+		CPUWriteMemory(address, reg[15].I + 4); \
1976
+		if (!count) \
1977
+			clockTicks += 1 + dataTicksAccess32(address); \
1978
+		else \
1979
+			clockTicks += 1 + dataTicksAccessSeq32(address); \
1980
+		++count; \
1981
+	}
2033 1982
 #define STMW_PC \
2034
-    if (opcode & (1U<<15)) {                            \
2035
-        CPUWriteMemory(address, reg[15].I+4);           \
2036
-        if (!count) {                                   \
2037
-            clockTicks += 1 + dataTicksAccess32(address);\
2038
-        } else {                                        \
2039
-            clockTicks += 1 + dataTicksAccessSeq32(address);\
2040
-        }                                               \
2041
-        reg[base].I = temp;                             \
2042
-        count++;                                        \
2043
-    }
1983
+	if (opcode & (1U << 15)) \
1984
+	{ \
1985
+		CPUWriteMemory(address, reg[15].I + 4); \
1986
+		if (!count) \
1987
+			clockTicks += 1 + dataTicksAccess32(address); \
1988
+		else \
1989
+			clockTicks += 1 + dataTicksAccessSeq32(address); \
1990
+		reg[base].I = temp; \
1991
+		++count; \
1992
+	}
2044 1993
 #define LDM_LOW \
2045
-    LDM_REG(0, 0);                                      \
2046
-    LDM_REG(1, 1);                                      \
2047
-    LDM_REG(2, 2);                                      \
2048
-    LDM_REG(3, 3);                                      \
2049
-    LDM_REG(4, 4);                                      \
2050
-    LDM_REG(5, 5);                                      \
2051
-    LDM_REG(6, 6);                                      \
2052
-    LDM_REG(7, 7);
1994
+	LDM_REG(0, 0); \
1995
+	LDM_REG(1, 1); \
1996
+	LDM_REG(2, 2); \
1997
+	LDM_REG(3, 3); \
1998
+	LDM_REG(4, 4); \
1999
+	LDM_REG(5, 5); \
2000
+	LDM_REG(6, 6); \
2001
+	LDM_REG(7, 7);
2053 2002
 #define LDM_HIGH \
2054
-    LDM_REG(8, 8);                                      \
2055
-    LDM_REG(9, 9);                                      \
2056
-    LDM_REG(10, 10);                                    \
2057
-    LDM_REG(11, 11);                                    \
2058
-    LDM_REG(12, 12);                                    \
2059
-    LDM_REG(13, 13);                                    \
2060
-    LDM_REG(14, 14);
2003
+	LDM_REG(8, 8); \
2004
+	LDM_REG(9, 9); \
2005
+	LDM_REG(10, 10); \
2006
+	LDM_REG(11, 11); \
2007
+	LDM_REG(12, 12); \
2008
+	LDM_REG(13, 13); \
2009
+	LDM_REG(14, 14);
2061 2010
 #define LDM_HIGH_2 \
2062
-    if (armMode == 0x11) {                              \
2063
-        LDM_REG(8, R8_FIQ);                             \
2064
-        LDM_REG(9, R9_FIQ);                             \
2065
-        LDM_REG(10, R10_FIQ);                           \
2066
-        LDM_REG(11, R11_FIQ);                           \
2067
-        LDM_REG(12, R12_FIQ);                           \
2068
-    } else {                                            \
2069
-        LDM_REG(8, 8);                                  \
2070
-        LDM_REG(9, 9);                                  \
2071
-        LDM_REG(10, 10);                                \
2072
-        LDM_REG(11, 11);                                \
2073
-        LDM_REG(12, 12);                                \
2074
-    }                                                   \
2075
-    if (armMode != 0x10 && armMode != 0x1F) {           \
2076
-        LDM_REG(13, R13_USR);                           \
2077
-        LDM_REG(14, R14_USR);                           \
2078
-    } else {                                            \
2079
-        LDM_REG(13, 13);                                \
2080
-        LDM_REG(14, 14);                                \
2081
-    }
2011
+	if (armMode == 0x11) \
2012
+	{ \
2013
+		LDM_REG(8, R8_FIQ); \
2014
+		LDM_REG(9, R9_FIQ); \
2015
+		LDM_REG(10, R10_FIQ); \
2016
+		LDM_REG(11, R11_FIQ); \
2017
+		LDM_REG(12, R12_FIQ); \
2018
+	} \
2019
+	else \
2020
+	{ \
2021
+		LDM_REG(8, 8); \
2022
+		LDM_REG(9, 9); \
2023
+		LDM_REG(10, 10); \
2024
+		LDM_REG(11, 11); \
2025
+		LDM_REG(12, 12); \
2026
+	} \
2027
+	if (armMode != 0x10 && armMode != 0x1F) \
2028
+	{ \
2029
+		LDM_REG(13, R13_USR); \
2030
+		LDM_REG(14, R14_USR); \
2031
+	} \
2032
+	else \
2033
+	{ \
2034
+		LDM_REG(13, 13); \
2035
+		LDM_REG(14, 14); \
2036
+	}
2082 2037
 #define STM_ALL \
2083
-    STM_LOW(STM_REG);                                   \
2084
-    STM_HIGH(STM_REG);                                  \
2085
-    STM_PC;
2038
+	STM_LOW(STM_REG); \
2039
+	STM_HIGH(STM_REG); \
2040
+	STM_PC;
2086 2041
 #define STMW_ALL \
2087
-    STM_LOW(STMW_REG);                                  \
2088
-    STM_HIGH(STMW_REG);                                 \
2089
-    STMW_PC;
2042
+	STM_LOW(STMW_REG); \
2043
+	STM_HIGH(STMW_REG); \
2044
+	STMW_PC;
2090 2045
 #define LDM_ALL \
2091
-    LDM_LOW;                                            \
2092
-    LDM_HIGH;                                           \
2093
-    if (opcode & (1U<<15)) {                            \
2094
-        reg[15].I = CPUReadMemory(address);             \
2095
-        if (!count) {                                   \
2096
-            clockTicks += 1 + dataTicksAccess32(address);\
2097
-        } else {                                        \
2098
-            clockTicks += 1 + dataTicksAccessSeq32(address);\
2099
-        }                                               \
2100
-        count++;                                        \
2101
-    }                                                   \
2102
-    if (opcode & (1U<<15)) {                            \
2103
-        armNextPC = reg[15].I;                          \
2104
-        reg[15].I += 4;                                 \
2105
-        ARM_PREFETCH;                                   \
2106
-        clockTicks += 1 + codeTicksAccessSeq32(armNextPC);\
2107
-    }
2046
+	LDM_LOW \
2047
+	LDM_HIGH; \
2048
+	if (opcode & (1U << 15)) \
2049
+	{ \
2050
+		reg[15].I = CPUReadMemory(address); \
2051
+		if (!count) \
2052
+			clockTicks += 1 + dataTicksAccess32(address); \
2053
+		else \
2054
+			clockTicks += 1 + dataTicksAccessSeq32(address); \
2055
+		++count; \
2056
+	} \
2057
+	if (opcode & (1U << 15)) \
2058
+	{ \
2059
+		armNextPC = reg[15].I; \
2060
+		reg[15].I += 4; \
2061
+		ARM_PREFETCH(); \
2062
+		clockTicks += 1 + codeTicksAccessSeq32(armNextPC); \
2063
+	}
2108 2064
 #define STM_ALL_2 \
2109
-    STM_LOW(STM_REG);                                   \
2110
-    STM_HIGH_2(STM_REG);                                \
2111
-    STM_PC;
2065
+	STM_LOW(STM_REG) \
2066
+	STM_HIGH_2(STM_REG); \
2067
+	STM_PC;
2112 2068
 #define STMW_ALL_2 \
2113
-    STM_LOW(STMW_REG);                                  \
2114
-    STM_HIGH_2(STMW_REG);                               \
2115
-    STMW_PC;
2069
+	STM_LOW(STMW_REG); \
2070
+	STM_HIGH_2(STMW_REG); \
2071
+	STMW_PC;
2116 2072
 #define LDM_ALL_2 \
2117
-    LDM_LOW;                                            \
2118
-    if (opcode & (1U<<15)) {                            \
2119
-        LDM_HIGH;                                       \
2120
-        reg[15].I = CPUReadMemory(address);             \
2121
-        if (!count) {                                   \
2122
-            clockTicks += 1 + dataTicksAccess32(address); \
2123
-        } else {                                        \
2124
-            clockTicks += 1 + dataTicksAccessSeq32(address); \
2125
-        }                                               \
2126
-        count++;                                        \
2127
-    } else {                                            \
2128
-        LDM_HIGH_2;                                     \
2129
-    }
2073
+	LDM_LOW; \
2074
+	if (opcode & (1U << 15)) \
2075
+	{ \
2076
+		LDM_HIGH; \
2077
+		reg[15].I = CPUReadMemory(address); \
2078
+		if (!count) \
2079
+			clockTicks += 1 + dataTicksAccess32(address); \
2080
+		else \
2081
+			clockTicks += 1 + dataTicksAccessSeq32(address); \
2082
+		++count; \
2083
+	} \
2084
+	else \
2085
+	{ \
2086
+		LDM_HIGH_2; \
2087
+	}
2130 2088
 #define LDM_ALL_2B \
2131
-    if (opcode & (1U<<15)) {                            \
2132
-        CPUSwitchMode(reg[17].I & 0x1F, false);         \
2133
-        if (armState) {                                 \
2134
-            armNextPC = reg[15].I & 0xFFFFFFFC;         \
2135
-            reg[15].I = armNextPC + 4;                  \
2136
-            ARM_PREFETCH;                               \
2137
-        } else {                                        \
2138
-            armNextPC = reg[15].I & 0xFFFFFFFE;         \
2139
-            reg[15].I = armNextPC + 2;                  \
2140
-            THUMB_PREFETCH;                             \
2141
-        }                                               \
2142
-        clockTicks += 1 + codeTicksAccessSeq32(armNextPC);\
2143
-    }
2144
-
2089
+	if (opcode & (1U << 15)) \
2090
+	{ \
2091
+		CPUSwitchMode(reg[17].I & 0x1F, false); \
2092
+		if (armState) \
2093
+		{ \
2094
+			armNextPC = reg[15].I & 0xFFFFFFFC; \
2095
+			reg[15].I = armNextPC + 4; \
2096
+			ARM_PREFETCH(); \
2097
+		} \
2098
+		else \
2099
+		{ \
2100
+			armNextPC = reg[15].I & 0xFFFFFFFE; \
2101
+			reg[15].I = armNextPC + 2; \
2102
+			THUMB_PREFETCH(); \
2103
+		} \
2104
+		clockTicks += 1 + codeTicksAccessSeq32(armNextPC); \
2105
+	}
2145 2106
 
2146 2107
 // STMDA Rn, {Rlist}
2147 2108
 static INSN_REGPARM void arm800(uint32_t opcode)
2148 2109
 {
2149
-    if (busPrefetchCount == 0)
2150
-        busPrefetch = busPrefetchEnable;
2151
-    int base = (opcode & 0x000F0000) >> 16;
2152
-    uint32_t temp = reg[base].I -
2153
-        4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2154
-    uint32_t address = (temp + 4) & 0xFFFFFFFC;
2155
-    int count = 0;
2156
-    STM_ALL;
2157
-    clockTicks += 1 + codeTicksAccess32(armNextPC);
2110
+	if (!busPrefetchCount)
2111
+		busPrefetch = busPrefetchEnable;
2112
+	int base = (opcode & 0x000F0000) >> 16;
2113
+	uint32_t temp = reg[base].I - 4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2114
+	uint32_t address = (temp + 4) & 0xFFFFFFFC;
2115
+	int count = 0;
2116
+	STM_ALL;
2117
+	clockTicks += 1 + codeTicksAccess32(armNextPC);
2158 2118
 }
2159 2119
 
2160 2120
 // LDMDA Rn, {Rlist}
2161 2121
 static INSN_REGPARM void arm810(uint32_t opcode)
2162 2122
 {
2163
-    if (busPrefetchCount == 0)
2164
-        busPrefetch = busPrefetchEnable;
2165
-    int base = (opcode & 0x000F0000) >> 16;
2166
-    uint32_t temp = reg[base].I -
2167
-        4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2168
-    uint32_t address = (temp + 4) & 0xFFFFFFFC;
2169
-    int count = 0;
2170
-    LDM_ALL;
2171
-    clockTicks += 2 + codeTicksAccess32(armNextPC);
2123
+	if (!busPrefetchCount)
2124
+		busPrefetch = busPrefetchEnable;
2125
+	int base = (opcode & 0x000F0000) >> 16;
2126
+	uint32_t temp = reg[base].I - 4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2127
+	uint32_t address = (temp + 4) & 0xFFFFFFFC;
2128
+	int count = 0;
2129
+	LDM_ALL;
2130
+	clockTicks += 2 + codeTicksAccess32(armNextPC);
2172 2131
 }
2173 2132
 
2174 2133
 // STMDA Rn!, {Rlist}
2175 2134
 static INSN_REGPARM void arm820(uint32_t opcode)
2176 2135
 {
2177
-    if (busPrefetchCount == 0)
2178
-        busPrefetch = busPrefetchEnable;
2179
-    int base = (opcode & 0x000F0000) >> 16;
2180
-    uint32_t temp = reg[base].I -
2181
-        4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2182
-    uint32_t address = (temp+4) & 0xFFFFFFFC;
2183
-    int count = 0;
2184
-    STMW_ALL;
2185
-    clockTicks += 1 + codeTicksAccess32(armNextPC);
2136
+	if (!busPrefetchCount)
2137
+		busPrefetch = busPrefetchEnable;
2138
+	int base = (opcode & 0x000F0000) >> 16;
2139
+	uint32_t temp = reg[base].I - 4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2140
+	uint32_t address = (temp + 4) & 0xFFFFFFFC;
2141
+	int count = 0;
2142
+	STMW_ALL;
2143
+	clockTicks += 1 + codeTicksAccess32(armNextPC);
2186 2144
 }
2187 2145
 
2188 2146
 // LDMDA Rn!, {Rlist}
2189 2147
 static INSN_REGPARM void arm830(uint32_t opcode)
2190 2148
 {
2191
-    if (busPrefetchCount == 0)
2192
-        busPrefetch = busPrefetchEnable;
2193
-    int base = (opcode & 0x000F0000) >> 16;
2194
-    uint32_t temp = reg[base].I -
2195
-        4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2196
-    uint32_t address = (temp + 4) & 0xFFFFFFFC;
2197
-    int count = 0;
2198
-    LDM_ALL;
2199
-    clockTicks += 2 + codeTicksAccess32(armNextPC);
2200
-    if (!(opcode & (1U << base)))
2201
-        reg[base].I = temp;
2149
+	if (!busPrefetchCount)
2150
+		busPrefetch = busPrefetchEnable;
2151
+	int base = (opcode & 0x000F0000) >> 16;
2152
+	uint32_t temp = reg[base].I - 4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2153
+	uint32_t address = (temp + 4) & 0xFFFFFFFC;
2154
+	int count = 0;
2155
+	LDM_ALL;
2156
+	clockTicks += 2 + codeTicksAccess32(armNextPC);
2157
+	if (!(opcode & (1U << base)))
2158
+		reg[base].I = temp;
2202 2159
 }
2203 2160
 
2204 2161
 // STMDA Rn, {Rlist}^
2205 2162
 static INSN_REGPARM void arm840(uint32_t opcode)
2206 2163
 {
2207
-    if (busPrefetchCount == 0)
2208
-        busPrefetch = busPrefetchEnable;
2209
-    int base = (opcode & 0x000F0000) >> 16;
2210
-    uint32_t temp = reg[base].I -
2211
-        4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2212
-    uint32_t address = (temp+4) & 0xFFFFFFFC;
2213
-    int count = 0;
2214
-    STM_ALL_2;
2215
-    clockTicks += 1 + codeTicksAccess32(armNextPC);
2164
+	if (!busPrefetchCount)
2165
+		busPrefetch = busPrefetchEnable;
2166
+	int base = (opcode & 0x000F0000) >> 16;
2167
+	uint32_t temp = reg[base].I - 4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2168
+	uint32_t address = (temp + 4) & 0xFFFFFFFC;
2169
+	int count = 0;
2170
+	STM_ALL_2;
2171
+	clockTicks += 1 + codeTicksAccess32(armNextPC);
2216 2172
 }
2217 2173
 
2218 2174
 // LDMDA Rn, {Rlist}^
2219 2175
 static INSN_REGPARM void arm850(uint32_t opcode)
2220 2176
 {
2221
-    if (busPrefetchCount == 0)
2222
-        busPrefetch = busPrefetchEnable;
2223
-    int base = (opcode & 0x000F0000) >> 16;
2224
-    uint32_t temp = reg[base].I -
2225
-        4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2226
-    uint32_t address = (temp + 4) & 0xFFFFFFFC;
2227
-    int count = 0;
2228
-    LDM_ALL_2;
2229
-    LDM_ALL_2B;
2230
-    clockTicks += 2 + codeTicksAccess32(armNextPC);
2177
+	if (!busPrefetchCount)
2178
+		busPrefetch = busPrefetchEnable;
2179
+	int base = (opcode & 0x000F0000) >> 16;
2180
+	uint32_t temp = reg[base].I - 4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2181
+	uint32_t address = (temp + 4) & 0xFFFFFFFC;
2182
+	int count = 0;
2183
+	LDM_ALL_2;
2184
+	LDM_ALL_2B;
2185
+	clockTicks += 2 + codeTicksAccess32(armNextPC);
2231 2186
 }
2232 2187
 
2233 2188
 // STMDA Rn!, {Rlist}^
2234 2189
 static INSN_REGPARM void arm860(uint32_t opcode)
2235 2190
 {
2236
-    if (busPrefetchCount == 0)
2237
-        busPrefetch = busPrefetchEnable;
2238
-    int base = (opcode & 0x000F0000) >> 16;
2239
-    uint32_t temp = reg[base].I -
2240
-        4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2241
-    uint32_t address = (temp+4) & 0xFFFFFFFC;
2242
-    int count = 0;
2243
-    STMW_ALL_2;
2244
-    clockTicks += 1 + codeTicksAccess32(armNextPC);
2191
+	if (!busPrefetchCount)
2192
+		busPrefetch = busPrefetchEnable;
2193
+	int base = (opcode & 0x000F0000) >> 16;
2194
+	uint32_t temp = reg[base].I - 4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2195
+	uint32_t address = (temp + 4) & 0xFFFFFFFC;
2196
+	int count = 0;
2197
+	STMW_ALL_2;
2198
+	clockTicks += 1 + codeTicksAccess32(armNextPC);
2245 2199
 }
2246 2200
 
2247 2201
 // LDMDA Rn!, {Rlist}^
2248 2202
 static INSN_REGPARM void arm870(uint32_t opcode)
2249 2203
 {
2250
-    if (busPrefetchCount == 0)
2251
-        busPrefetch = busPrefetchEnable;
2252
-    int base = (opcode & 0x000F0000) >> 16;
2253
-    uint32_t temp = reg[base].I -
2254
-        4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2255
-    uint32_t address = (temp + 4) & 0xFFFFFFFC;
2256
-    int count = 0;
2257
-    LDM_ALL_2;
2258
-    if (!(opcode & (1U << base)))
2259
-        reg[base].I = temp;
2260
-    LDM_ALL_2B;
2261
-    clockTicks += 2 + codeTicksAccess32(armNextPC);
2204
+	if (!busPrefetchCount)
2205
+		busPrefetch = busPrefetchEnable;
2206
+	int base = (opcode & 0x000F0000) >> 16;
2207
+	uint32_t temp = reg[base].I - 4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2208
+	uint32_t address = (temp + 4) & 0xFFFFFFFC;
2209
+	int count = 0;
2210
+	LDM_ALL_2;
2211
+	if (!(opcode & (1U << base)))
2212
+		reg[base].I = temp;
2213
+	LDM_ALL_2B;
2214
+	clockTicks += 2 + codeTicksAccess32(armNextPC);
2262 2215
 }
2263 2216
 
2264 2217
 // STMIA Rn, {Rlist}
2265 2218
 static INSN_REGPARM void arm880(uint32_t opcode)
2266 2219
 {
2267
-    if (busPrefetchCount == 0)
2268
-        busPrefetch = busPrefetchEnable;
2269
-    int base = (opcode & 0x000F0000) >> 16;
2270
-    uint32_t address = reg[base].I & 0xFFFFFFFC;
2271
-    int count = 0;
2272
-    STM_ALL;
2273
-    clockTicks += 1 + codeTicksAccess32(armNextPC);
2220
+	if (!busPrefetchCount)
2221
+		busPrefetch = busPrefetchEnable;
2222
+	int base = (opcode & 0x000F0000) >> 16;
2223
+	uint32_t address = reg[base].I & 0xFFFFFFFC;
2224
+	int count = 0;
2225
+	STM_ALL;
2226
+	clockTicks += 1 + codeTicksAccess32(armNextPC);
2274 2227
 }
2275 2228
 
2276 2229
 // LDMIA Rn, {Rlist}
2277 2230
 static INSN_REGPARM void arm890(uint32_t opcode)
2278 2231
 {
2279
-    if (busPrefetchCount == 0)
2280
-        busPrefetch = busPrefetchEnable;
2281
-    int base = (opcode & 0x000F0000) >> 16;
2282
-    uint32_t address = reg[base].I & 0xFFFFFFFC;
2283
-    int count = 0;
2284
-    LDM_ALL;
2285
-    clockTicks += 2 + codeTicksAccess32(armNextPC);
2232
+	if (!busPrefetchCount)
2233
+		busPrefetch = busPrefetchEnable;
2234
+	int base = (opcode & 0x000F0000) >> 16;
2235
+	uint32_t address = reg[base].I & 0xFFFFFFFC;
2236
+	int count = 0;
2237
+	LDM_ALL;
2238
+	clockTicks += 2 + codeTicksAccess32(armNextPC);
2286 2239
 }
2287 2240
 
2288 2241
 // STMIA Rn!, {Rlist}
2289 2242
 static INSN_REGPARM void arm8A0(uint32_t opcode)
2290 2243
 {
2291
-    if (busPrefetchCount == 0)
2292
-        busPrefetch = busPrefetchEnable;
2293
-    int base = (opcode & 0x000F0000) >> 16;
2294
-    uint32_t address = reg[base].I & 0xFFFFFFFC;
2295
-    int count = 0;
2296
-    uint32_t temp = reg[base].I +
2297
-        4 * (cpuBitsSet[opcode & 0xFF] + cpuBitsSet[(opcode >> 8) & 255]);
2298
-    STMW_ALL;
2299
-    clockTicks += 1 + codeTicksAccess32(armNextPC);
2244
+	if (!busPrefetchCount)
2245
+		busPrefetch = busPrefetchEnable;
2246
+	int base = (opcode & 0x000F0000) >> 16;
2247
+	uint32_t address = reg[base].I & 0xFFFFFFFC;
2248
+	int count = 0;
2249
+	uint32_t temp = reg[base].I + 4 * (cpuBitsSet[opcode & 0xFF] + cpuBitsSet[(opcode >> 8) & 255]);
2250
+	STMW_ALL;
2251
+	clockTicks += 1 + codeTicksAccess32(armNextPC);
2300 2252
 }
2301 2253
 
2302 2254
 // LDMIA Rn!, {Rlist}
2303 2255
 static INSN_REGPARM void arm8B0(uint32_t opcode)
2304 2256
 {
2305
-    if (busPrefetchCount == 0)
2306
-        busPrefetch = busPrefetchEnable;
2307
-    int base = (opcode & 0x000F0000) >> 16;
2308
-    uint32_t temp = reg[base].I +
2309
-        4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2310
-    uint32_t address = reg[base].I & 0xFFFFFFFC;
2311
-    int count = 0;
2312
-    LDM_ALL;
2313
-    clockTicks += 2 + codeTicksAccess32(armNextPC);
2314
-    if (!(opcode & (1U << base)))
2315
-        reg[base].I = temp;
2257
+	if (!busPrefetchCount)
2258
+		busPrefetch = busPrefetchEnable;
2259
+	int base = (opcode & 0x000F0000) >> 16;
2260
+	uint32_t temp = reg[base].I + 4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2261
+	uint32_t address = reg[base].I & 0xFFFFFFFC;
2262
+	int count = 0;
2263
+	LDM_ALL;
2264
+	clockTicks += 2 + codeTicksAccess32(armNextPC);
2265
+	if (!(opcode & (1U << base)))
2266
+		reg[base].I = temp;
2316 2267
 }
2317 2268
 
2318 2269
 // STMIA Rn, {Rlist}^
2319 2270
 static INSN_REGPARM void arm8C0(uint32_t opcode)
2320 2271
 {
2321
-    if (busPrefetchCount == 0)
2322
-        busPrefetch = busPrefetchEnable;
2323
-    int base = (opcode & 0x000F0000) >> 16;
2324
-    uint32_t address = reg[base].I & 0xFFFFFFFC;
2325
-    int count = 0;
2326
-    STM_ALL_2;
2327
-    clockTicks += 1 + codeTicksAccess32(armNextPC);
2272
+	if (!busPrefetchCount)
2273
+		busPrefetch = busPrefetchEnable;
2274
+	int base = (opcode & 0x000F0000) >> 16;
2275
+	uint32_t address = reg[base].I & 0xFFFFFFFC;
2276
+	int count = 0;
2277
+	STM_ALL_2;
2278
+	clockTicks += 1 + codeTicksAccess32(armNextPC);
2328 2279
 }
2329 2280
 
2330 2281
 // LDMIA Rn, {Rlist}^
2331 2282
 static INSN_REGPARM void arm8D0(uint32_t opcode)
2332 2283
 {
2333
-    if (busPrefetchCount == 0)
2334
-        busPrefetch = busPrefetchEnable;
2335
-    int base = (opcode & 0x000F0000) >> 16;
2336
-    uint32_t address = reg[base].I & 0xFFFFFFFC;
2337
-    int count = 0;
2338
-    LDM_ALL_2;
2339
-    LDM_ALL_2B;
2340
-    clockTicks += 2 + codeTicksAccess32(armNextPC);
2284
+	if (!busPrefetchCount)
2285
+		busPrefetch = busPrefetchEnable;
2286
+	int base = (opcode & 0x000F0000) >> 16;
2287
+	uint32_t address = reg[base].I & 0xFFFFFFFC;
2288
+	int count = 0;
2289
+	LDM_ALL_2;
2290
+	LDM_ALL_2B;
2291
+	clockTicks += 2 + codeTicksAccess32(armNextPC);
2341 2292
 }
2342 2293
 
2343 2294
 // STMIA Rn!, {Rlist}^
2344 2295
 static INSN_REGPARM void arm8E0(uint32_t opcode)
2345 2296
 {
2346
-    if (busPrefetchCount == 0)
2347
-        busPrefetch = busPrefetchEnable;
2348
-    int base = (opcode & 0x000F0000) >> 16;
2349
-    uint32_t address = reg[base].I & 0xFFFFFFFC;
2350
-    int count = 0;
2351
-    uint32_t temp = reg[base].I +
2352
-        4 * (cpuBitsSet[opcode & 0xFF] + cpuBitsSet[(opcode >> 8) & 255]);
2353
-    STMW_ALL_2;
2354
-    clockTicks += 1 + codeTicksAccess32(armNextPC);
2297
+	if (!busPrefetchCount)
2298
+		busPrefetch = busPrefetchEnable;
2299
+	int base = (opcode & 0x000F0000) >> 16;
2300
+	uint32_t address = reg[base].I & 0xFFFFFFFC;
2301
+	int count = 0;
2302
+	uint32_t temp = reg[base].I + 4 * (cpuBitsSet[opcode & 0xFF] + cpuBitsSet[(opcode >> 8) & 255]);
2303
+	STMW_ALL_2;
2304
+	clockTicks += 1 + codeTicksAccess32(armNextPC);
2355 2305
 }
2356 2306
 
2357 2307
 // LDMIA Rn!, {Rlist}^
2358 2308
 static INSN_REGPARM void arm8F0(uint32_t opcode)
2359 2309
 {
2360
-    if (busPrefetchCount == 0)
2361
-        busPrefetch = busPrefetchEnable;
2362
-    int base = (opcode & 0x000F0000) >> 16;
2363
-    uint32_t temp = reg[base].I +
2364
-        4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2365
-    uint32_t address = reg[base].I & 0xFFFFFFFC;
2366
-    int count = 0;
2367
-    LDM_ALL_2;
2368
-    if (!(opcode & (1U << base)))
2369
-        reg[base].I = temp;
2370
-    LDM_ALL_2B;
2371
-    clockTicks += 2 + codeTicksAccess32(armNextPC);
2310
+	if (!busPrefetchCount)
2311
+		busPrefetch = busPrefetchEnable;
2312
+	int base = (opcode & 0x000F0000) >> 16;
2313
+	uint32_t temp = reg[base].I + 4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2314
+	uint32_t address = reg[base].I & 0xFFFFFFFC;
2315
+	int count = 0;
2316
+	LDM_ALL_2;
2317
+	if (!(opcode & (1U << base)))
2318
+		reg[base].I = temp;
2319
+	LDM_ALL_2B;
2320
+	clockTicks += 2 + codeTicksAccess32(armNextPC);
2372 2321
 }
2373 2322
 
2374 2323
 // STMDB Rn, {Rlist}
2375 2324
 static INSN_REGPARM void arm900(uint32_t opcode)
2376 2325
 {
2377
-    if (busPrefetchCount == 0)
2378
-        busPrefetch = busPrefetchEnable;
2379
-    int base = (opcode & 0x000F0000) >> 16;
2380
-    uint32_t temp = reg[base].I -
2381
-        4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2382
-    uint32_t address = temp & 0xFFFFFFFC;
2383
-    int count = 0;
2384
-    STM_ALL;
2385
-    clockTicks += 1 + codeTicksAccess32(armNextPC);
2326
+	if (!busPrefetchCount)
2327
+		busPrefetch = busPrefetchEnable;
2328
+	int base = (opcode & 0x000F0000) >> 16;
2329
+	uint32_t temp = reg[base].I - 4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2330
+	uint32_t address = temp & 0xFFFFFFFC;
2331
+	int count = 0;
2332
+	STM_ALL;
2333
+	clockTicks += 1 + codeTicksAccess32(armNextPC);
2386 2334
 }
2387 2335
 
2388 2336
 // LDMDB Rn, {Rlist}
2389 2337
 static INSN_REGPARM void arm910(uint32_t opcode)
2390 2338
 {
2391
-    if (busPrefetchCount == 0)
2392
-        busPrefetch = busPrefetchEnable;
2393
-    int base = (opcode & 0x000F0000) >> 16;
2394
-    uint32_t temp = reg[base].I -
2395
-        4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2396
-    uint32_t address = temp & 0xFFFFFFFC;
2397
-    int count = 0;
2398
-    LDM_ALL;
2399
-    clockTicks += 2 + codeTicksAccess32(armNextPC);
2339
+	if (!busPrefetchCount)
2340
+		busPrefetch = busPrefetchEnable;
2341
+	int base = (opcode & 0x000F0000) >> 16;
2342
+	uint32_t temp = reg[base].I - 4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2343
+	uint32_t address = temp & 0xFFFFFFFC;
2344
+	int count = 0;
2345
+	LDM_ALL;
2346
+	clockTicks += 2 + codeTicksAccess32(armNextPC);
2400 2347
 }
2401 2348
 
2402 2349
 // STMDB Rn!, {Rlist}
2403 2350
 static INSN_REGPARM void arm920(uint32_t opcode)
2404 2351
 {
2405
-    if (busPrefetchCount == 0)
2406
-        busPrefetch = busPrefetchEnable;
2407
-    int base = (opcode & 0x000F0000) >> 16;
2408
-    uint32_t temp = reg[base].I -
2409
-        4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2410
-    uint32_t address = temp & 0xFFFFFFFC;
2411
-    int count = 0;
2412
-    STMW_ALL;
2413
-    clockTicks += 1 + codeTicksAccess32(armNextPC);
2352
+	if (!busPrefetchCount)
2353
+		busPrefetch = busPrefetchEnable;
2354
+	int base = (opcode & 0x000F0000) >> 16;
2355
+	uint32_t temp = reg[base].I - 4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2356
+	uint32_t address = temp & 0xFFFFFFFC;
2357
+	int count = 0;
2358
+	STMW_ALL;
2359
+	clockTicks += 1 + codeTicksAccess32(armNextPC);
2414 2360
 }
2415 2361
 
2416 2362
 // LDMDB Rn!, {Rlist}
2417 2363
 static INSN_REGPARM void arm930(uint32_t opcode)
2418 2364
 {
2419
-    if (busPrefetchCount == 0)
2420
-        busPrefetch = busPrefetchEnable;
2421
-    int base = (opcode & 0x000F0000) >> 16;
2422
-    uint32_t temp = reg[base].I -
2423
-        4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2424
-    uint32_t address = temp & 0xFFFFFFFC;
2425
-    int count = 0;
2426
-    LDM_ALL;
2427
-    clockTicks += 2 + codeTicksAccess32(armNextPC);
2428
-    if (!(opcode & (1U << base)))
2429
-        reg[base].I = temp;
2365
+	if (!busPrefetchCount)
2366
+		busPrefetch = busPrefetchEnable;
2367
+	int base = (opcode & 0x000F0000) >> 16;
2368
+	uint32_t temp = reg[base].I - 4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2369
+	uint32_t address = temp & 0xFFFFFFFC;
2370
+	int count = 0;
2371
+	LDM_ALL;
2372
+	clockTicks += 2 + codeTicksAccess32(armNextPC);
2373
+	if (!(opcode & (1U << base)))
2374
+		reg[base].I = temp;
2430 2375
 }
2431 2376
 
2432 2377
 // STMDB Rn, {Rlist}^
2433 2378
 static INSN_REGPARM void arm940(uint32_t opcode)
2434 2379
 {
2435
-    if (busPrefetchCount == 0)
2436
-        busPrefetch = busPrefetchEnable;
2437
-    int base = (opcode & 0x000F0000) >> 16;
2438
-    uint32_t temp = reg[base].I -
2439
-        4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2440
-    uint32_t address = temp & 0xFFFFFFFC;
2441
-    int count = 0;
2442
-    STM_ALL_2;
2443
-    clockTicks += 1 + codeTicksAccess32(armNextPC);
2380
+	if (!busPrefetchCount)
2381
+		busPrefetch = busPrefetchEnable;
2382
+	int base = (opcode & 0x000F0000) >> 16;
2383
+	uint32_t temp = reg[base].I - 4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2384
+	uint32_t address = temp & 0xFFFFFFFC;
2385
+	int count = 0;
2386
+	STM_ALL_2;
2387
+	clockTicks += 1 + codeTicksAccess32(armNextPC);
2444 2388
 }
2445 2389
 
2446 2390
 // LDMDB Rn, {Rlist}^
2447 2391
 static INSN_REGPARM void arm950(uint32_t opcode)
2448 2392
 {
2449
-    if (busPrefetchCount == 0)
2450
-        busPrefetch = busPrefetchEnable;
2451
-    int base = (opcode & 0x000F0000) >> 16;
2452
-    uint32_t temp = reg[base].I -
2453
-        4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2454
-    uint32_t address = temp & 0xFFFFFFFC;
2455
-    int count = 0;
2456
-    LDM_ALL_2;
2457
-    LDM_ALL_2B;
2458
-    clockTicks += 2 + codeTicksAccess32(armNextPC);
2393
+	if (!busPrefetchCount)
2394
+		busPrefetch = busPrefetchEnable;
2395
+	int base = (opcode & 0x000F0000) >> 16;
2396
+	uint32_t temp = reg[base].I - 4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2397
+	uint32_t address = temp & 0xFFFFFFFC;
2398
+	int count = 0;
2399
+	LDM_ALL_2;
2400
+	LDM_ALL_2B;
2401
+	clockTicks += 2 + codeTicksAccess32(armNextPC);
2459 2402
 }
2460 2403
 
2461 2404
 // STMDB Rn!, {Rlist}^
2462 2405
 static INSN_REGPARM void arm960(uint32_t opcode)
2463 2406
 {
2464
-    if (busPrefetchCount == 0)
2465
-        busPrefetch = busPrefetchEnable;
2466
-    int base = (opcode & 0x000F0000) >> 16;
2467
-    uint32_t temp = reg[base].I -
2468
-        4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2469
-    uint32_t address = temp & 0xFFFFFFFC;
2470
-    int count = 0;
2471
-    STMW_ALL_2;
2472
-    clockTicks += 1 + codeTicksAccess32(armNextPC);
2407
+	if (!busPrefetchCount)
2408
+		busPrefetch = busPrefetchEnable;
2409
+	int base = (opcode & 0x000F0000) >> 16;
2410
+	uint32_t temp = reg[base].I - 4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2411
+	uint32_t address = temp & 0xFFFFFFFC;
2412
+	int count = 0;
2413
+	STMW_ALL_2;
2414
+	clockTicks += 1 + codeTicksAccess32(armNextPC);
2473 2415
 }
2474 2416
 
2475 2417
 // LDMDB Rn!, {Rlist}^
2476 2418
 static INSN_REGPARM void arm970(uint32_t opcode)
2477 2419
 {
2478
-    if (busPrefetchCount == 0)
2479
-        busPrefetch = busPrefetchEnable;
2480
-    int base = (opcode & 0x000F0000) >> 16;
2481
-    uint32_t temp = reg[base].I -
2482
-        4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2483
-    uint32_t address = temp & 0xFFFFFFFC;
2484
-    int count = 0;
2485
-    LDM_ALL_2;
2486
-    if (!(opcode & (1U << base)))
2487
-        reg[base].I = temp;
2488
-    LDM_ALL_2B;
2489
-    clockTicks += 2 + codeTicksAccess32(armNextPC);
2420
+	if (!busPrefetchCount)
2421
+		busPrefetch = busPrefetchEnable;
2422
+	int base = (opcode & 0x000F0000) >> 16;
2423
+	uint32_t temp = reg[base].I - 4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2424
+	uint32_t address = temp & 0xFFFFFFFC;
2425
+	int count = 0;
2426
+	LDM_ALL_2;
2427
+	if (!(opcode & (1U << base)))
2428
+		reg[base].I = temp;
2429
+	LDM_ALL_2B;
2430
+	clockTicks += 2 + codeTicksAccess32(armNextPC);
2490 2431
 }
2491 2432
 
2492 2433
 // STMIB Rn, {Rlist}
2493 2434
 static INSN_REGPARM void arm980(uint32_t opcode)
2494 2435
 {
2495
-    if (busPrefetchCount == 0)
2496
-        busPrefetch = busPrefetchEnable;
2497
-    int base = (opcode & 0x000F0000) >> 16;
2498
-    uint32_t address = (reg[base].I+4) & 0xFFFFFFFC;
2499
-    int count = 0;
2500
-    STM_ALL;
2501
-    clockTicks += 1 + codeTicksAccess32(armNextPC);
2436
+	if (!busPrefetchCount)
2437
+		busPrefetch = busPrefetchEnable;
2438
+	int base = (opcode & 0x000F0000) >> 16;
2439
+	uint32_t address = (reg[base].I + 4) & 0xFFFFFFFC;
2440
+	int count = 0;
2441
+	STM_ALL;
2442
+	clockTicks += 1 + codeTicksAccess32(armNextPC);
2502 2443
 }
2503 2444
 
2504 2445
 // LDMIB Rn, {Rlist}
2505 2446
 static INSN_REGPARM void arm990(uint32_t opcode)
2506 2447
 {
2507
-    if (busPrefetchCount == 0)
2508
-        busPrefetch = busPrefetchEnable;
2509
-    int base = (opcode & 0x000F0000) >> 16;
2510
-    uint32_t address = (reg[base].I+4) & 0xFFFFFFFC;
2511
-    int count = 0;
2512
-    LDM_ALL;
2513
-    clockTicks += 2 + codeTicksAccess32(armNextPC);
2448
+	if (!busPrefetchCount)
2449
+		busPrefetch = busPrefetchEnable;
2450
+	int base = (opcode & 0x000F0000) >> 16;
2451
+	uint32_t address = (reg[base].I + 4) & 0xFFFFFFFC;
2452
+	int count = 0;
2453
+	LDM_ALL;
2454
+	clockTicks += 2 + codeTicksAccess32(armNextPC);
2514 2455
 }
2515 2456
 
2516 2457
 // STMIB Rn!, {Rlist}
2517 2458
 static INSN_REGPARM void arm9A0(uint32_t opcode)
2518 2459
 {
2519
-    if (busPrefetchCount == 0)
2520
-        busPrefetch = busPrefetchEnable;
2521
-    int base = (opcode & 0x000F0000) >> 16;
2522
-    uint32_t address = (reg[base].I+4) & 0xFFFFFFFC;
2523
-    int count = 0;
2524
-    uint32_t temp = reg[base].I +
2525
-        4 * (cpuBitsSet[opcode & 0xFF] + cpuBitsSet[(opcode >> 8) & 255]);
2526
-    STMW_ALL;
2527
-    clockTicks += 1 + codeTicksAccess32(armNextPC);
2460
+	if (!busPrefetchCount)
2461
+		busPrefetch = busPrefetchEnable;
2462
+	int base = (opcode & 0x000F0000) >> 16;
2463
+	uint32_t address = (reg[base].I + 4) & 0xFFFFFFFC;
2464
+	int count = 0;
2465
+	uint32_t temp = reg[base].I + 4 * (cpuBitsSet[opcode & 0xFF] + cpuBitsSet[(opcode >> 8) & 255]);
2466
+	STMW_ALL;
2467
+	clockTicks += 1 + codeTicksAccess32(armNextPC);
2528 2468
 }
2529 2469
 
2530 2470
 // LDMIB Rn!, {Rlist}
2531 2471
 static INSN_REGPARM void arm9B0(uint32_t opcode)
2532 2472
 {
2533
-    if (busPrefetchCount == 0)
2534
-        busPrefetch = busPrefetchEnable;
2535
-    int base = (opcode & 0x000F0000) >> 16;
2536
-    uint32_t temp = reg[base].I +
2537
-        4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2538
-    uint32_t address = (reg[base].I+4) & 0xFFFFFFFC;
2539
-    int count = 0;
2540
-    LDM_ALL;
2541
-    clockTicks += 2 + codeTicksAccess32(armNextPC);
2542
-    if (!(opcode & (1U << base)))
2543
-        reg[base].I = temp;
2473
+	if (!busPrefetchCount)
2474
+		busPrefetch = busPrefetchEnable;
2475
+	int base = (opcode & 0x000F0000) >> 16;
2476
+	uint32_t temp = reg[base].I + 4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2477
+	uint32_t address = (reg[base].I + 4) & 0xFFFFFFFC;
2478
+	int count = 0;
2479
+	LDM_ALL;
2480
+	clockTicks += 2 + codeTicksAccess32(armNextPC);
2481
+	if (!(opcode & (1U << base)))
2482
+		reg[base].I = temp;
2544 2483
 }
2545 2484
 
2546 2485
 // STMIB Rn, {Rlist}^
2547 2486
 static INSN_REGPARM void arm9C0(uint32_t opcode)
2548 2487
 {
2549
-    if (busPrefetchCount == 0)
2550
-        busPrefetch = busPrefetchEnable;
2551
-    int base = (opcode & 0x000F0000) >> 16;
2552
-    uint32_t address = (reg[base].I+4) & 0xFFFFFFFC;
2553
-    int count = 0;
2554
-    STM_ALL_2;
2555
-    clockTicks += 1 + codeTicksAccess32(armNextPC);
2488
+	if (!busPrefetchCount)
2489
+		busPrefetch = busPrefetchEnable;
2490
+	int base = (opcode & 0x000F0000) >> 16;
2491
+	uint32_t address = (reg[base].I + 4) & 0xFFFFFFFC;
2492
+	int count = 0;
2493
+	STM_ALL_2;
2494
+	clockTicks += 1 + codeTicksAccess32(armNextPC);
2556 2495
 }
2557 2496
 
2558 2497
 // LDMIB Rn, {Rlist}^
2559 2498
 static INSN_REGPARM void arm9D0(uint32_t opcode)
2560 2499
 {
2561
-    if (busPrefetchCount == 0)
2562
-        busPrefetch = busPrefetchEnable;
2563
-    int base = (opcode & 0x000F0000) >> 16;
2564
-    uint32_t address = (reg[base].I+4) & 0xFFFFFFFC;
2565
-    int count = 0;
2566
-    LDM_ALL_2;
2567
-    LDM_ALL_2B;
2568
-    clockTicks += 2 + codeTicksAccess32(armNextPC);
2500
+	if (!busPrefetchCount)
2501
+		busPrefetch = busPrefetchEnable;
2502
+	int base = (opcode & 0x000F0000) >> 16;
2503
+	uint32_t address = (reg[base].I + 4) & 0xFFFFFFFC;
2504
+	int count = 0;
2505
+	LDM_ALL_2;
2506
+	LDM_ALL_2B;
2507
+	clockTicks += 2 + codeTicksAccess32(armNextPC);
2569 2508
 }
2570 2509
 
2571 2510
 // STMIB Rn!, {Rlist}^
2572 2511
 static INSN_REGPARM void arm9E0(uint32_t opcode)
2573 2512
 {
2574
-    if (busPrefetchCount == 0)
2575
-        busPrefetch = busPrefetchEnable;
2576
-    int base = (opcode & 0x000F0000) >> 16;
2577
-    uint32_t address = (reg[base].I+4) & 0xFFFFFFFC;
2578
-    int count = 0;
2579
-    uint32_t temp = reg[base].I +
2580
-        4 * (cpuBitsSet[opcode & 0xFF] + cpuBitsSet[(opcode >> 8) & 255]);
2581
-    STMW_ALL_2;
2582
-    clockTicks += 1 + codeTicksAccess32(armNextPC);
2513
+	if (!busPrefetchCount)
2514
+		busPrefetch = busPrefetchEnable;
2515
+	int base = (opcode & 0x000F0000) >> 16;
2516
+	uint32_t address = (reg[base].I + 4) & 0xFFFFFFFC;
2517
+	int count = 0;
2518
+	uint32_t temp = reg[base].I + 4 * (cpuBitsSet[opcode & 0xFF] + cpuBitsSet[(opcode >> 8) & 255]);
2519
+	STMW_ALL_2;
2520
+	clockTicks += 1 + codeTicksAccess32(armNextPC);
2583 2521
 }
2584 2522
 
2585 2523
 // LDMIB Rn!, {Rlist}^
2586 2524
 static INSN_REGPARM void arm9F0(uint32_t opcode)
2587 2525
 {
2588
-    if (busPrefetchCount == 0)
2589
-        busPrefetch = busPrefetchEnable;
2590
-    int base = (opcode & 0x000F0000) >> 16;
2591
-    uint32_t temp = reg[base].I +
2592
-        4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2593
-    uint32_t address = (reg[base].I+4) & 0xFFFFFFFC;
2594
-    int count = 0;
2595
-    LDM_ALL_2;
2596
-    if (!(opcode & (1U << base)))
2597
-        reg[base].I = temp;
2598
-    LDM_ALL_2B;
2599
-    clockTicks += 2 + codeTicksAccess32(armNextPC);
2526
+	if (!busPrefetchCount)
2527
+		busPrefetch = busPrefetchEnable;
2528
+	int base = (opcode & 0x000F0000) >> 16;
2529
+	uint32_t temp = reg[base].I + 4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2530
+	uint32_t address = (reg[base].I + 4) & 0xFFFFFFFC;
2531
+	int count = 0;
2532
+	LDM_ALL_2;
2533
+	if (!(opcode & (1U << base)))
2534
+		reg[base].I = temp;
2535
+	LDM_ALL_2B;
2536
+	clockTicks += 2 + codeTicksAccess32(armNextPC);
2600 2537
 }
2601 2538
 
2602 2539
 // B/BL/SWI and (unimplemented) coproc support ////////////////////////////
... ...
@@ -2604,365 +2541,326 @@ static INSN_REGPARM void arm9F0(uint32_t opcode)
2604 2541
 // B <offset>
2605 2542
 static INSN_REGPARM void armA00(uint32_t opcode)
2606 2543
 {
2607
-    int offset = opcode & 0x00FFFFFF;
2608
-    if (offset & 0x00800000)
2609
-        offset |= 0xFF000000;  // negative offset
2610
-    reg[15].I += offset<<2;
2611
-    armNextPC = reg[15].I;
2612
-    reg[15].I += 4;
2613
-    ARM_PREFETCH;
2614
-    clockTicks = codeTicksAccessSeq32(armNextPC) + 1;
2615
-    clockTicks = (clockTicks * 2) + codeTicksAccess32(armNextPC) + 1;
2616
-    busPrefetchCount = 0;
2544
+	int offset = opcode & 0x00FFFFFF;
2545
+	if (offset & 0x00800000)
2546
+		offset |= 0xFF000000; // negative offset
2547
+	reg[15].I += offset << 2;
2548
+	armNextPC = reg[15].I;
2549
+	reg[15].I += 4;
2550
+	ARM_PREFETCH();
2551
+	clockTicks = codeTicksAccessSeq32(armNextPC) + 1;
2552
+	clockTicks = (clockTicks * 2) + codeTicksAccess32(armNextPC) + 1;
2553
+	busPrefetchCount = 0;
2617 2554
 }
2618 2555
 
2619 2556
 // BL <offset>
2620 2557
 static INSN_REGPARM void armB00(uint32_t opcode)
2621 2558
 {
2622
-    int offset = opcode & 0x00FFFFFF;
2623
-    if (offset & 0x00800000)
2624
-        offset |= 0xFF000000;  // negative offset
2625
-    reg[14].I = reg[15].I - 4;
2626
-    reg[15].I += offset<<2;
2627
-    armNextPC = reg[15].I;
2628
-    reg[15].I += 4;
2629
-    ARM_PREFETCH;
2630
-    clockTicks = codeTicksAccessSeq32(armNextPC) + 1;
2631
-    clockTicks += 2 + codeTicksAccess32(armNextPC)
2632
-                    + codeTicksAccessSeq32(armNextPC);
2633
-    busPrefetchCount = 0;
2559
+	int offset = opcode & 0x00FFFFFF;
2560
+	if (offset & 0x00800000)
2561
+		offset |= 0xFF000000; // negative offset
2562
+	reg[14].I = reg[15].I - 4;
2563
+	reg[15].I += offset << 2;
2564
+	armNextPC = reg[15].I;
2565
+	reg[15].I += 4;
2566
+	ARM_PREFETCH();
2567
+	clockTicks = codeTicksAccessSeq32(armNextPC) + 1;
2568
+	clockTicks += 2 + codeTicksAccess32(armNextPC) + codeTicksAccessSeq32(armNextPC);
2569
+	busPrefetchCount = 0;
2634 2570
 }
2635 2571
 
2636
-
2637
-#ifdef GP_SUPPORT
2638
-// MRC
2639
-static INSN_REGPARM void armE01(uint32_t opcode)
2640
-{
2641
-}
2642
-#else
2643
- #define armE01 armUnknownInsn
2644
-#endif
2645
-
2572
+#define armE01 armUnknownInsn
2646 2573
 
2647 2574
 // SWI <comment>
2648 2575
 static INSN_REGPARM void armF00(uint32_t opcode)
2649 2576
 {
2650
-    clockTicks = codeTicksAccessSeq32(armNextPC) + 1;
2651
-        clockTicks = (clockTicks * 2) + codeTicksAccess32(armNextPC) + 1;
2652
-    busPrefetchCount = 0;
2653
-    CPUSoftwareInterrupt(opcode & 0x00FFFFFF);
2577
+	clockTicks = codeTicksAccessSeq32(armNextPC) + 1;
2578
+	clockTicks = (clockTicks * 2) + codeTicksAccess32(armNextPC) + 1;
2579
+	busPrefetchCount = 0;
2580
+	CPUSoftwareInterrupt(opcode & 0x00FFFFFF);
2654 2581
 }
2655 2582
 
2656 2583
 // Instruction table //////////////////////////////////////////////////////
2657 2584
 
2658 2585
 typedef INSN_REGPARM void (*insnfunc_t)(uint32_t opcode);
2659 2586
 #define REP16(insn) \
2660
-    insn,insn,insn,insn,insn,insn,insn,insn,\
2661
-    insn,insn,insn,insn,insn,insn,insn,insn
2587
+	insn, insn, insn, insn, insn, insn, insn, insn, \
2588
+	insn, insn, insn, insn, insn, insn, insn, insn
2662 2589
 #define REP256(insn) \
2663
-    REP16(insn),REP16(insn),REP16(insn),REP16(insn),\
2664
-    REP16(insn),REP16(insn),REP16(insn),REP16(insn),\
2665
-    REP16(insn),REP16(insn),REP16(insn),REP16(insn),\
2666
-    REP16(insn),REP16(insn),REP16(insn),REP16(insn)
2590
+	REP16(insn), REP16(insn), REP16(insn), REP16(insn), \
2591
+	REP16(insn), REP16(insn), REP16(insn), REP16(insn), \
2592
+	REP16(insn), REP16(insn), REP16(insn), REP16(insn), \
2593
+	REP16(insn), REP16(insn), REP16(insn), REP16(insn)
2667 2594
 #define arm_UI armUnknownInsn
2668
-#ifdef BKPT_SUPPORT
2669
- #define arm_BP armBreakpoint
2670
-#else
2671
- #define arm_BP armUnknownInsn
2672
-#endif
2673
-static insnfunc_t armInsnTable[4096] = {
2674
-    arm000,arm001,arm002,arm003,arm004,arm005,arm006,arm007,  // 000
2675
-    arm000,arm009,arm002,arm00B,arm004,arm_UI,arm006,arm_UI,  // 008
2676
-    arm010,arm011,arm012,arm013,arm014,arm015,arm016,arm017,  // 010
2677
-    arm010,arm019,arm012,arm01B,arm014,arm01D,arm016,arm01F,  // 018
2678
-    arm020,arm021,arm022,arm023,arm024,arm025,arm026,arm027,  // 020
2679
-    arm020,arm029,arm022,arm_UI,arm024,arm_UI,arm026,arm_UI,  // 028
2680
-    arm030,arm031,arm032,arm033,arm034,arm035,arm036,arm037,  // 030
2681
-    arm030,arm039,arm032,arm_UI,arm034,arm01D,arm036,arm01F,  // 038
2682
-    arm040,arm041,arm042,arm043,arm044,arm045,arm046,arm047,  // 040
2683
-    arm040,arm_UI,arm042,arm04B,arm044,arm_UI,arm046,arm_UI,  // 048
2684
-    arm050,arm051,arm052,arm053,arm054,arm055,arm056,arm057,  // 050
2685
-    arm050,arm_UI,arm052,arm05B,arm054,arm05D,arm056,arm05F,  // 058
2686
-    arm060,arm061,arm062,arm063,arm064,arm065,arm066,arm067,  // 060
2687
-    arm060,arm_UI,arm062,arm_UI,arm064,arm_UI,arm066,arm_UI,  // 068
2688
-    arm070,arm071,arm072,arm073,arm074,arm075,arm076,arm077,  // 070
2689
-    arm070,arm_UI,arm072,arm_UI,arm074,arm05D,arm076,arm05F,  // 078
2690
-    arm080,arm081,arm082,arm083,arm084,arm085,arm086,arm087,  // 080
2691
-    arm080,arm089,arm082,arm08B,arm084,arm_UI,arm086,arm_UI,  // 088
2692
-    arm090,arm091,arm092,arm093,arm094,arm095,arm096,arm097,  // 090
2693
-    arm090,arm099,arm092,arm09B,arm094,arm09D,arm096,arm09F,  // 098
2694
-    arm0A0,arm0A1,arm0A2,arm0A3,arm0A4,arm0A5,arm0A6,arm0A7,  // 0A0
2695
-    arm0A0,arm0A9,arm0A2,arm_UI,arm0A4,arm_UI,arm0A6,arm_UI,  // 0A8
2696
-    arm0B0,arm0B1,arm0B2,arm0B3,arm0B4,arm0B5,arm0B6,arm0B7,  // 0B0
2697
-    arm0B0,arm0B9,arm0B2,arm_UI,arm0B4,arm09D,arm0B6,arm09F,  // 0B8
2698
-    arm0C0,arm0C1,arm0C2,arm0C3,arm0C4,arm0C5,arm0C6,arm0C7,  // 0C0
2699
-    arm0C0,arm0C9,arm0C2,arm0CB,arm0C4,arm_UI,arm0C6,arm_UI,  // 0C8
2700
-    arm0D0,arm0D1,arm0D2,arm0D3,arm0D4,arm0D5,arm0D6,arm0D7,  // 0D0
2701
-    arm0D0,arm0D9,arm0D2,arm0DB,arm0D4,arm0DD,arm0D6,arm0DF,  // 0D8
2702
-    arm0E0,arm0E1,arm0E2,arm0E3,arm0E4,arm0E5,arm0E6,arm0E7,  // 0E0
2703
-    arm0E0,arm0E9,arm0E2,arm0CB,arm0E4,arm_UI,arm0E6,arm_UI,  // 0E8
2704
-    arm0F0,arm0F1,arm0F2,arm0F3,arm0F4,arm0F5,arm0F6,arm0F7,  // 0F0
2705
-    arm0F0,arm0F9,arm0F2,arm0DB,arm0F4,arm0DD,arm0F6,arm0DF,  // 0F8
2706
-
2707
-    arm100,arm_UI,arm_UI,arm_UI,arm_UI,arm_UI,arm_UI,arm_UI,  // 100
2708
-    arm_UI,arm109,arm_UI,arm10B,arm_UI,arm_UI,arm_UI,arm_UI,  // 108
2709
-    arm110,arm111,arm112,arm113,arm114,arm115,arm116,arm117,  // 110
2710
-    arm110,arm_UI,arm112,arm11B,arm114,arm11D,arm116,arm11F,  // 118
2711
-    arm120,arm121,arm_UI,arm_UI,arm_UI,arm_UI,arm_UI,arm_BP,  // 120
2712
-    arm_UI,arm_UI,arm_UI,arm12B,arm_UI,arm_UI,arm_UI,arm_UI,  // 128
2713
-    arm130,arm131,arm132,arm133,arm134,arm135,arm136,arm137,  // 130
2714
-    arm130,arm_UI,arm132,arm13B,arm134,arm13D,arm136,arm13F,  // 138
2715
-    arm140,arm_UI,arm_UI,arm_UI,arm_UI,arm_UI,arm_UI,arm_UI,  // 140
2716
-    arm_UI,arm149,arm_UI,arm14B,arm_UI,arm_UI,arm_UI,arm_UI,  // 148
2717
-    arm150,arm151,arm152,arm153,arm154,arm155,arm156,arm157,  // 150
2718
-    arm150,arm_UI,arm152,arm15B,arm154,arm15D,arm156,arm15F,  // 158
2719
-    arm160,arm_UI,arm_UI,arm_UI,arm_UI,arm_UI,arm_UI,arm_UI,  // 160
2720
-    arm_UI,arm_UI,arm_UI,arm16B,arm_UI,arm_UI,arm_UI,arm_UI,  // 168
2721
-    arm170,arm171,arm172,arm173,arm174,arm175,arm176,arm177,  // 170
2722
-    arm170,arm_UI,arm172,arm17B,arm174,arm17D,arm176,arm17F,  // 178
2723
-    arm180,arm181,arm182,arm183,arm184,arm185,arm186,arm187,  // 180
2724
-    arm180,arm_UI,arm182,arm18B,arm184,arm_UI,arm186,arm_UI,  // 188
2725
-    arm190,arm191,arm192,arm193,arm194,arm195,arm196,arm197,  // 190
2726
-    arm190,arm_UI,arm192,arm19B,arm194,arm19D,arm196,arm19F,  // 198
2727
-    arm1A0,arm1A1,arm1A2,arm1A3,arm1A4,arm1A5,arm1A6,arm1A7,  // 1A0
2728
-    arm1A0,arm_UI,arm1A2,arm1AB,arm1A4,arm_UI,arm1A6,arm_UI,  // 1A8
2729
-    arm1B0,arm1B1,arm1B2,arm1B3,arm1B4,arm1B5,arm1B6,arm1B7,  // 1B0
2730
-    arm1B0,arm_UI,arm1B2,arm1BB,arm1B4,arm1BD,arm1B6,arm1BF,  // 1B8
2731
-    arm1C0,arm1C1,arm1C2,arm1C3,arm1C4,arm1C5,arm1C6,arm1C7,  // 1C0
2732
-    arm1C0,arm_UI,arm1C2,arm1CB,arm1C4,arm_UI,arm1C6,arm_UI,  // 1C8
2733
-    arm1D0,arm1D1,arm1D2,arm1D3,arm1D4,arm1D5,arm1D6,arm1D7,  // 1D0
2734
-    arm1D0,arm_UI,arm1D2,arm1DB,arm1D4,arm1DD,arm1D6,arm1DF,  // 1D8
2735
-    arm1E0,arm1E1,arm1E2,arm1E3,arm1E4,arm1E5,arm1E6,arm1E7,  // 1E0
2736
-    arm1E0,arm_UI,arm1E2,arm1EB,arm1E4,arm_UI,arm1E6,arm_UI,  // 1E8
2737
-    arm1F0,arm1F1,arm1F2,arm1F3,arm1F4,arm1F5,arm1F6,arm1F7,  // 1F0
2738
-    arm1F0,arm_UI,arm1F2,arm1FB,arm1F4,arm1FD,arm1F6,arm1FF,  // 1F8
2739
-
2740
-    REP16(arm200),REP16(arm210),REP16(arm220),REP16(arm230),  // 200
2741
-    REP16(arm240),REP16(arm250),REP16(arm260),REP16(arm270),  // 240
2742
-    REP16(arm280),REP16(arm290),REP16(arm2A0),REP16(arm2B0),  // 280
2743
-    REP16(arm2C0),REP16(arm2D0),REP16(arm2E0),REP16(arm2F0),  // 2C0
2744
-    REP16(arm_UI),REP16(arm310),REP16(arm320),REP16(arm330),  // 300
2745
-    REP16(arm_UI),REP16(arm350),REP16(arm360),REP16(arm370),  // 340
2746
-    REP16(arm380),REP16(arm390),REP16(arm3A0),REP16(arm3B0),  // 380
2747
-    REP16(arm3C0),REP16(arm3D0),REP16(arm3E0),REP16(arm3F0),  // 3C0
2748
-
2749
-    REP16(arm400),REP16(arm410),REP16(arm400),REP16(arm410),  // 400
2750
-    REP16(arm440),REP16(arm450),REP16(arm440),REP16(arm450),  // 440
2751
-    REP16(arm480),REP16(arm490),REP16(arm480),REP16(arm490),  // 480
2752
-    REP16(arm4C0),REP16(arm4D0),REP16(arm4C0),REP16(arm4D0),  // 4C0
2753
-    REP16(arm500),REP16(arm510),REP16(arm520),REP16(arm530),  // 500
2754
-    REP16(arm540),REP16(arm550),REP16(arm560),REP16(arm570),  // 540
2755
-    REP16(arm580),REP16(arm590),REP16(arm5A0),REP16(arm5B0),  // 580
2756
-    REP16(arm5C0),REP16(arm5D0),REP16(arm5E0),REP16(arm5F0),  // 5C0
2757
-
2758
-    arm600,arm_UI,arm602,arm_UI,arm604,arm_UI,arm606,arm_UI,  // 600
2759
-    arm600,arm_UI,arm602,arm_UI,arm604,arm_UI,arm606,arm_UI,  // 608
2760
-    arm610,arm_UI,arm612,arm_UI,arm614,arm_UI,arm616,arm_UI,  // 610
2761
-    arm610,arm_UI,arm612,arm_UI,arm614,arm_UI,arm616,arm_UI,  // 618
2762
-    arm600,arm_UI,arm602,arm_UI,arm604,arm_UI,arm606,arm_UI,  // 620
2763
-    arm600,arm_UI,arm602,arm_UI,arm604,arm_UI,arm606,arm_UI,  // 628
2764
-    arm610,arm_UI,arm612,arm_UI,arm614,arm_UI,arm616,arm_UI,  // 630
2765
-    arm610,arm_UI,arm612,arm_UI,arm614,arm_UI,arm616,arm_UI,  // 638
2766
-    arm640,arm_UI,arm642,arm_UI,arm644,arm_UI,arm646,arm_UI,  // 640
2767
-    arm640,arm_UI,arm642,arm_UI,arm644,arm_UI,arm646,arm_UI,  // 648
2768
-    arm650,arm_UI,arm652,arm_UI,arm654,arm_UI,arm656,arm_UI,  // 650
2769
-    arm650,arm_UI,arm652,arm_UI,arm654,arm_UI,arm656,arm_UI,  // 658
2770
-    arm640,arm_UI,arm642,arm_UI,arm644,arm_UI,arm646,arm_UI,  // 660
2771
-    arm640,arm_UI,arm642,arm_UI,arm644,arm_UI,arm646,arm_UI,  // 668
2772
-    arm650,arm_UI,arm652,arm_UI,arm654,arm_UI,arm656,arm_UI,  // 670
2773
-    arm650,arm_UI,arm652,arm_UI,arm654,arm_UI,arm656,arm_UI,  // 678
2774
-    arm680,arm_UI,arm682,arm_UI,arm684,arm_UI,arm686,arm_UI,  // 680
2775
-    arm680,arm_UI,arm682,arm_UI,arm684,arm_UI,arm686,arm_UI,  // 688
2776
-    arm690,arm_UI,arm692,arm_UI,arm694,arm_UI,arm696,arm_UI,  // 690
2777
-    arm690,arm_UI,arm692,arm_UI,arm694,arm_UI,arm696,arm_UI,  // 698
2778
-    arm680,arm_UI,arm682,arm_UI,arm684,arm_UI,arm686,arm_UI,  // 6A0
2779
-    arm680,arm_UI,arm682,arm_UI,arm684,arm_UI,arm686,arm_UI,  // 6A8
2780
-    arm690,arm_UI,arm692,arm_UI,arm694,arm_UI,arm696,arm_UI,  // 6B0
2781
-    arm690,arm_UI,arm692,arm_UI,arm694,arm_UI,arm696,arm_UI,  // 6B8
2782
-    arm6C0,arm_UI,arm6C2,arm_UI,arm6C4,arm_UI,arm6C6,arm_UI,  // 6C0
2783
-    arm6C0,arm_UI,arm6C2,arm_UI,arm6C4,arm_UI,arm6C6,arm_UI,  // 6C8
2784
-    arm6D0,arm_UI,arm6D2,arm_UI,arm6D4,arm_UI,arm6D6,arm_UI,  // 6D0
2785
-    arm6D0,arm_UI,arm6D2,arm_UI,arm6D4,arm_UI,arm6D6,arm_UI,  // 6D8
2786
-    arm6C0,arm_UI,arm6C2,arm_UI,arm6C4,arm_UI,arm6C6,arm_UI,  // 6E0
2787
-    arm6C0,arm_UI,arm6C2,arm_UI,arm6C4,arm_UI,arm6C6,arm_UI,  // 6E8
2788
-    arm6D0,arm_UI,arm6D2,arm_UI,arm6D4,arm_UI,arm6D6,arm_UI,  // 6F0
2789
-    arm6D0,arm_UI,arm6D2,arm_UI,arm6D4,arm_UI,arm6D6,arm_UI,  // 6F8
2790
-
2791
-    arm700,arm_UI,arm702,arm_UI,arm704,arm_UI,arm706,arm_UI,  // 700
2792
-    arm700,arm_UI,arm702,arm_UI,arm704,arm_UI,arm706,arm_UI,  // 708
2793
-    arm710,arm_UI,arm712,arm_UI,arm714,arm_UI,arm716,arm_UI,  // 710
2794
-    arm710,arm_UI,arm712,arm_UI,arm714,arm_UI,arm716,arm_UI,  // 718
2795
-    arm720,arm_UI,arm722,arm_UI,arm724,arm_UI,arm726,arm_UI,  // 720
2796
-    arm720,arm_UI,arm722,arm_UI,arm724,arm_UI,arm726,arm_UI,  // 728
2797
-    arm730,arm_UI,arm732,arm_UI,arm734,arm_UI,arm736,arm_UI,  // 730
2798
-    arm730,arm_UI,arm732,arm_UI,arm734,arm_UI,arm736,arm_UI,  // 738
2799
-    arm740,arm_UI,arm742,arm_UI,arm744,arm_UI,arm746,arm_UI,  // 740
2800
-    arm740,arm_UI,arm742,arm_UI,arm744,arm_UI,arm746,arm_UI,  // 748
2801
-    arm750,arm_UI,arm752,arm_UI,arm754,arm_UI,arm756,arm_UI,  // 750
2802
-    arm750,arm_UI,arm752,arm_UI,arm754,arm_UI,arm756,arm_UI,  // 758
2803
-    arm760,arm_UI,arm762,arm_UI,arm764,arm_UI,arm766,arm_UI,  // 760
2804
-    arm760,arm_UI,arm762,arm_UI,arm764,arm_UI,arm766,arm_UI,  // 768
2805
-    arm770,arm_UI,arm772,arm_UI,arm774,arm_UI,arm776,arm_UI,  // 770
2806
-    arm770,arm_UI,arm772,arm_UI,arm774,arm_UI,arm776,arm_UI,  // 778
2807
-    arm780,arm_UI,arm782,arm_UI,arm784,arm_UI,arm786,arm_UI,  // 780
2808
-    arm780,arm_UI,arm782,arm_UI,arm784,arm_UI,arm786,arm_UI,  // 788
2809
-    arm790,arm_UI,arm792,arm_UI,arm794,arm_UI,arm796,arm_UI,  // 790
2810
-    arm790,arm_UI,arm792,arm_UI,arm794,arm_UI,arm796,arm_UI,  // 798
2811
-    arm7A0,arm_UI,arm7A2,arm_UI,arm7A4,arm_UI,arm7A6,arm_UI,  // 7A0
2812
-    arm7A0,arm_UI,arm7A2,arm_UI,arm7A4,arm_UI,arm7A6,arm_UI,  // 7A8
2813
-    arm7B0,arm_UI,arm7B2,arm_UI,arm7B4,arm_UI,arm7B6,arm_UI,  // 7B0
2814
-    arm7B0,arm_UI,arm7B2,arm_UI,arm7B4,arm_UI,arm7B6,arm_UI,  // 7B8
2815
-    arm7C0,arm_UI,arm7C2,arm_UI,arm7C4,arm_UI,arm7C6,arm_UI,  // 7C0
2816
-    arm7C0,arm_UI,arm7C2,arm_UI,arm7C4,arm_UI,arm7C6,arm_UI,  // 7C8
2817
-    arm7D0,arm_UI,arm7D2,arm_UI,arm7D4,arm_UI,arm7D6,arm_UI,  // 7D0
2818
-    arm7D0,arm_UI,arm7D2,arm_UI,arm7D4,arm_UI,arm7D6,arm_UI,  // 7D8
2819
-    arm7E0,arm_UI,arm7E2,arm_UI,arm7E4,arm_UI,arm7E6,arm_UI,  // 7E0
2820
-    arm7E0,arm_UI,arm7E2,arm_UI,arm7E4,arm_UI,arm7E6,arm_UI,  // 7E8
2821
-    arm7F0,arm_UI,arm7F2,arm_UI,arm7F4,arm_UI,arm7F6,arm_UI,  // 7F0
2822
-    arm7F0,arm_UI,arm7F2,arm_UI,arm7F4,arm_UI,arm7F6,arm_BP,  // 7F8
2823
-
2824
-    REP16(arm800),REP16(arm810),REP16(arm820),REP16(arm830),  // 800
2825
-    REP16(arm840),REP16(arm850),REP16(arm860),REP16(arm870),  // 840
2826
-    REP16(arm880),REP16(arm890),REP16(arm8A0),REP16(arm8B0),  // 880
2827
-    REP16(arm8C0),REP16(arm8D0),REP16(arm8E0),REP16(arm8F0),  // 8C0
2828
-    REP16(arm900),REP16(arm910),REP16(arm920),REP16(arm930),  // 900
2829
-    REP16(arm940),REP16(arm950),REP16(arm960),REP16(arm970),  // 940
2830
-    REP16(arm980),REP16(arm990),REP16(arm9A0),REP16(arm9B0),  // 980
2831
-    REP16(arm9C0),REP16(arm9D0),REP16(arm9E0),REP16(arm9F0),  // 9C0
2832
-
2833
-    REP256(armA00),                                           // A00
2834
-    REP256(armB00),                                           // B00
2835
-    REP256(arm_UI),                                           // C00
2836
-    REP256(arm_UI),                                           // D00
2837
-
2838
-    arm_UI,armE01,arm_UI,armE01,arm_UI,armE01,arm_UI,armE01,  // E00
2839
-    arm_UI,armE01,arm_UI,armE01,arm_UI,armE01,arm_UI,armE01,  // E08
2840
-    arm_UI,armE01,arm_UI,armE01,arm_UI,armE01,arm_UI,armE01,  // E10
2841
-    arm_UI,armE01,arm_UI,armE01,arm_UI,armE01,arm_UI,armE01,  // E18
2842
-    REP16(arm_UI),                                            // E20
2843
-    REP16(arm_UI),                                            // E30
2844
-    REP16(arm_UI),REP16(arm_UI),REP16(arm_UI),REP16(arm_UI),  // E40
2845
-    REP16(arm_UI),REP16(arm_UI),REP16(arm_UI),REP16(arm_UI),  // E80
2846
-    REP16(arm_UI),REP16(arm_UI),REP16(arm_UI),REP16(arm_UI),  // EC0
2847
-
2848
-    REP256(armF00),                                           // F00
2595
+#define arm_BP armUnknownInsn
2596
+static insnfunc_t armInsnTable[] =
2597
+{
2598
+	arm000,arm001,arm002,arm003,arm004,arm005,arm006,arm007,  // 000
2599
+	arm000,arm009,arm002,arm00B,arm004,arm_UI,arm006,arm_UI,  // 008
2600
+	arm010,arm011,arm012,arm013,arm014,arm015,arm016,arm017,  // 010
2601
+	arm010,arm019,arm012,arm01B,arm014,arm01D,arm016,arm01F,  // 018
2602
+	arm020,arm021,arm022,arm023,arm024,arm025,arm026,arm027,  // 020
2603
+	arm020,arm029,arm022,arm_UI,arm024,arm_UI,arm026,arm_UI,  // 028
2604
+	arm030,arm031,arm032,arm033,arm034,arm035,arm036,arm037,  // 030
2605
+	arm030,arm039,arm032,arm_UI,arm034,arm01D,arm036,arm01F,  // 038
2606
+	arm040,arm041,arm042,arm043,arm044,arm045,arm046,arm047,  // 040
2607
+	arm040,arm_UI,arm042,arm04B,arm044,arm_UI,arm046,arm_UI,  // 048
2608
+	arm050,arm051,arm052,arm053,arm054,arm055,arm056,arm057,  // 050
2609
+	arm050,arm_UI,arm052,arm05B,arm054,arm05D,arm056,arm05F,  // 058
2610
+	arm060,arm061,arm062,arm063,arm064,arm065,arm066,arm067,  // 060
2611
+	arm060,arm_UI,arm062,arm_UI,arm064,arm_UI,arm066,arm_UI,  // 068
2612
+	arm070,arm071,arm072,arm073,arm074,arm075,arm076,arm077,  // 070
2613
+	arm070,arm_UI,arm072,arm_UI,arm074,arm05D,arm076,arm05F,  // 078
2614
+	arm080,arm081,arm082,arm083,arm084,arm085,arm086,arm087,  // 080
2615
+	arm080,arm089,arm082,arm08B,arm084,arm_UI,arm086,arm_UI,  // 088
2616
+	arm090,arm091,arm092,arm093,arm094,arm095,arm096,arm097,  // 090
2617
+	arm090,arm099,arm092,arm09B,arm094,arm09D,arm096,arm09F,  // 098
2618
+	arm0A0,arm0A1,arm0A2,arm0A3,arm0A4,arm0A5,arm0A6,arm0A7,  // 0A0
2619
+	arm0A0,arm0A9,arm0A2,arm_UI,arm0A4,arm_UI,arm0A6,arm_UI,  // 0A8
2620
+	arm0B0,arm0B1,arm0B2,arm0B3,arm0B4,arm0B5,arm0B6,arm0B7,  // 0B0
2621
+	arm0B0,arm0B9,arm0B2,arm_UI,arm0B4,arm09D,arm0B6,arm09F,  // 0B8
2622
+	arm0C0,arm0C1,arm0C2,arm0C3,arm0C4,arm0C5,arm0C6,arm0C7,  // 0C0
2623
+	arm0C0,arm0C9,arm0C2,arm0CB,arm0C4,arm_UI,arm0C6,arm_UI,  // 0C8
2624
+	arm0D0,arm0D1,arm0D2,arm0D3,arm0D4,arm0D5,arm0D6,arm0D7,  // 0D0
2625
+	arm0D0,arm0D9,arm0D2,arm0DB,arm0D4,arm0DD,arm0D6,arm0DF,  // 0D8
2626
+	arm0E0,arm0E1,arm0E2,arm0E3,arm0E4,arm0E5,arm0E6,arm0E7,  // 0E0
2627
+	arm0E0,arm0E9,arm0E2,arm0CB,arm0E4,arm_UI,arm0E6,arm_UI,  // 0E8
2628
+	arm0F0,arm0F1,arm0F2,arm0F3,arm0F4,arm0F5,arm0F6,arm0F7,  // 0F0
2629
+	arm0F0,arm0F9,arm0F2,arm0DB,arm0F4,arm0DD,arm0F6,arm0DF,  // 0F8
2630
+
2631
+	arm100,arm_UI,arm_UI,arm_UI,arm_UI,arm_UI,arm_UI,arm_UI,  // 100
2632
+	arm_UI,arm109,arm_UI,arm10B,arm_UI,arm_UI,arm_UI,arm_UI,  // 108
2633
+	arm110,arm111,arm112,arm113,arm114,arm115,arm116,arm117,  // 110
2634
+	arm110,arm_UI,arm112,arm11B,arm114,arm11D,arm116,arm11F,  // 118
2635
+	arm120,arm121,arm_UI,arm_UI,arm_UI,arm_UI,arm_UI,arm_BP,  // 120
2636
+	arm_UI,arm_UI,arm_UI,arm12B,arm_UI,arm_UI,arm_UI,arm_UI,  // 128
2637
+	arm130,arm131,arm132,arm133,arm134,arm135,arm136,arm137,  // 130
2638
+	arm130,arm_UI,arm132,arm13B,arm134,arm13D,arm136,arm13F,  // 138
2639
+	arm140,arm_UI,arm_UI,arm_UI,arm_UI,arm_UI,arm_UI,arm_UI,  // 140
2640
+	arm_UI,arm149,arm_UI,arm14B,arm_UI,arm_UI,arm_UI,arm_UI,  // 148
2641
+	arm150,arm151,arm152,arm153,arm154,arm155,arm156,arm157,  // 150
2642
+	arm150,arm_UI,arm152,arm15B,arm154,arm15D,arm156,arm15F,  // 158
2643
+	arm160,arm_UI,arm_UI,arm_UI,arm_UI,arm_UI,arm_UI,arm_UI,  // 160
2644
+	arm_UI,arm_UI,arm_UI,arm16B,arm_UI,arm_UI,arm_UI,arm_UI,  // 168
2645
+	arm170,arm171,arm172,arm173,arm174,arm175,arm176,arm177,  // 170
2646
+	arm170,arm_UI,arm172,arm17B,arm174,arm17D,arm176,arm17F,  // 178
2647
+	arm180,arm181,arm182,arm183,arm184,arm185,arm186,arm187,  // 180
2648
+	arm180,arm_UI,arm182,arm18B,arm184,arm_UI,arm186,arm_UI,  // 188
2649
+	arm190,arm191,arm192,arm193,arm194,arm195,arm196,arm197,  // 190
2650
+	arm190,arm_UI,arm192,arm19B,arm194,arm19D,arm196,arm19F,  // 198
2651
+	arm1A0,arm1A1,arm1A2,arm1A3,arm1A4,arm1A5,arm1A6,arm1A7,  // 1A0
2652
+	arm1A0,arm_UI,arm1A2,arm1AB,arm1A4,arm_UI,arm1A6,arm_UI,  // 1A8
2653
+	arm1B0,arm1B1,arm1B2,arm1B3,arm1B4,arm1B5,arm1B6,arm1B7,  // 1B0
2654
+	arm1B0,arm_UI,arm1B2,arm1BB,arm1B4,arm1BD,arm1B6,arm1BF,  // 1B8
2655
+	arm1C0,arm1C1,arm1C2,arm1C3,arm1C4,arm1C5,arm1C6,arm1C7,  // 1C0
2656
+	arm1C0,arm_UI,arm1C2,arm1CB,arm1C4,arm_UI,arm1C6,arm_UI,  // 1C8
2657
+	arm1D0,arm1D1,arm1D2,arm1D3,arm1D4,arm1D5,arm1D6,arm1D7,  // 1D0
2658
+	arm1D0,arm_UI,arm1D2,arm1DB,arm1D4,arm1DD,arm1D6,arm1DF,  // 1D8
2659
+	arm1E0,arm1E1,arm1E2,arm1E3,arm1E4,arm1E5,arm1E6,arm1E7,  // 1E0
2660
+	arm1E0,arm_UI,arm1E2,arm1EB,arm1E4,arm_UI,arm1E6,arm_UI,  // 1E8
2661
+	arm1F0,arm1F1,arm1F2,arm1F3,arm1F4,arm1F5,arm1F6,arm1F7,  // 1F0
2662
+	arm1F0,arm_UI,arm1F2,arm1FB,arm1F4,arm1FD,arm1F6,arm1FF,  // 1F8
2663
+
2664
+	REP16(arm200),REP16(arm210),REP16(arm220),REP16(arm230),  // 200
2665
+	REP16(arm240),REP16(arm250),REP16(arm260),REP16(arm270),  // 240
2666
+	REP16(arm280),REP16(arm290),REP16(arm2A0),REP16(arm2B0),  // 280
2667
+	REP16(arm2C0),REP16(arm2D0),REP16(arm2E0),REP16(arm2F0),  // 2C0
2668
+	REP16(arm_UI),REP16(arm310),REP16(arm320),REP16(arm330),  // 300
2669
+	REP16(arm_UI),REP16(arm350),REP16(arm360),REP16(arm370),  // 340
2670
+	REP16(arm380),REP16(arm390),REP16(arm3A0),REP16(arm3B0),  // 380
2671
+	REP16(arm3C0),REP16(arm3D0),REP16(arm3E0),REP16(arm3F0),  // 3C0
2672
+
2673
+	REP16(arm400),REP16(arm410),REP16(arm400),REP16(arm410),  // 400
2674
+	REP16(arm440),REP16(arm450),REP16(arm440),REP16(arm450),  // 440
2675
+	REP16(arm480),REP16(arm490),REP16(arm480),REP16(arm490),  // 480
2676
+	REP16(arm4C0),REP16(arm4D0),REP16(arm4C0),REP16(arm4D0),  // 4C0
2677
+	REP16(arm500),REP16(arm510),REP16(arm520),REP16(arm530),  // 500
2678
+	REP16(arm540),REP16(arm550),REP16(arm560),REP16(arm570),  // 540
2679
+	REP16(arm580),REP16(arm590),REP16(arm5A0),REP16(arm5B0),  // 580
2680
+	REP16(arm5C0),REP16(arm5D0),REP16(arm5E0),REP16(arm5F0),  // 5C0
2681
+
2682
+	arm600,arm_UI,arm602,arm_UI,arm604,arm_UI,arm606,arm_UI,  // 600
2683
+	arm600,arm_UI,arm602,arm_UI,arm604,arm_UI,arm606,arm_UI,  // 608
2684
+	arm610,arm_UI,arm612,arm_UI,arm614,arm_UI,arm616,arm_UI,  // 610
2685
+	arm610,arm_UI,arm612,arm_UI,arm614,arm_UI,arm616,arm_UI,  // 618
2686
+	arm600,arm_UI,arm602,arm_UI,arm604,arm_UI,arm606,arm_UI,  // 620
2687
+	arm600,arm_UI,arm602,arm_UI,arm604,arm_UI,arm606,arm_UI,  // 628
2688
+	arm610,arm_UI,arm612,arm_UI,arm614,arm_UI,arm616,arm_UI,  // 630
2689
+	arm610,arm_UI,arm612,arm_UI,arm614,arm_UI,arm616,arm_UI,  // 638
2690
+	arm640,arm_UI,arm642,arm_UI,arm644,arm_UI,arm646,arm_UI,  // 640
2691
+	arm640,arm_UI,arm642,arm_UI,arm644,arm_UI,arm646,arm_UI,  // 648
2692
+	arm650,arm_UI,arm652,arm_UI,arm654,arm_UI,arm656,arm_UI,  // 650
2693
+	arm650,arm_UI,arm652,arm_UI,arm654,arm_UI,arm656,arm_UI,  // 658
2694
+	arm640,arm_UI,arm642,arm_UI,arm644,arm_UI,arm646,arm_UI,  // 660
2695
+	arm640,arm_UI,arm642,arm_UI,arm644,arm_UI,arm646,arm_UI,  // 668
2696
+	arm650,arm_UI,arm652,arm_UI,arm654,arm_UI,arm656,arm_UI,  // 670
2697
+	arm650,arm_UI,arm652,arm_UI,arm654,arm_UI,arm656,arm_UI,  // 678
2698
+	arm680,arm_UI,arm682,arm_UI,arm684,arm_UI,arm686,arm_UI,  // 680
2699
+	arm680,arm_UI,arm682,arm_UI,arm684,arm_UI,arm686,arm_UI,  // 688
2700
+	arm690,arm_UI,arm692,arm_UI,arm694,arm_UI,arm696,arm_UI,  // 690
2701
+	arm690,arm_UI,arm692,arm_UI,arm694,arm_UI,arm696,arm_UI,  // 698
2702
+	arm680,arm_UI,arm682,arm_UI,arm684,arm_UI,arm686,arm_UI,  // 6A0
2703
+	arm680,arm_UI,arm682,arm_UI,arm684,arm_UI,arm686,arm_UI,  // 6A8
2704
+	arm690,arm_UI,arm692,arm_UI,arm694,arm_UI,arm696,arm_UI,  // 6B0
2705
+	arm690,arm_UI,arm692,arm_UI,arm694,arm_UI,arm696,arm_UI,  // 6B8
2706
+	arm6C0,arm_UI,arm6C2,arm_UI,arm6C4,arm_UI,arm6C6,arm_UI,  // 6C0
2707
+	arm6C0,arm_UI,arm6C2,arm_UI,arm6C4,arm_UI,arm6C6,arm_UI,  // 6C8
2708
+	arm6D0,arm_UI,arm6D2,arm_UI,arm6D4,arm_UI,arm6D6,arm_UI,  // 6D0
2709
+	arm6D0,arm_UI,arm6D2,arm_UI,arm6D4,arm_UI,arm6D6,arm_UI,  // 6D8
2710
+	arm6C0,arm_UI,arm6C2,arm_UI,arm6C4,arm_UI,arm6C6,arm_UI,  // 6E0
2711
+	arm6C0,arm_UI,arm6C2,arm_UI,arm6C4,arm_UI,arm6C6,arm_UI,  // 6E8
2712
+	arm6D0,arm_UI,arm6D2,arm_UI,arm6D4,arm_UI,arm6D6,arm_UI,  // 6F0
2713
+	arm6D0,arm_UI,arm6D2,arm_UI,arm6D4,arm_UI,arm6D6,arm_UI,  // 6F8
2714
+
2715
+	arm700,arm_UI,arm702,arm_UI,arm704,arm_UI,arm706,arm_UI,  // 700
2716
+	arm700,arm_UI,arm702,arm_UI,arm704,arm_UI,arm706,arm_UI,  // 708
2717
+	arm710,arm_UI,arm712,arm_UI,arm714,arm_UI,arm716,arm_UI,  // 710
2718
+	arm710,arm_UI,arm712,arm_UI,arm714,arm_UI,arm716,arm_UI,  // 718
2719
+	arm720,arm_UI,arm722,arm_UI,arm724,arm_UI,arm726,arm_UI,  // 720
2720
+	arm720,arm_UI,arm722,arm_UI,arm724,arm_UI,arm726,arm_UI,  // 728
2721
+	arm730,arm_UI,arm732,arm_UI,arm734,arm_UI,arm736,arm_UI,  // 730
2722
+	arm730,arm_UI,arm732,arm_UI,arm734,arm_UI,arm736,arm_UI,  // 738
2723
+	arm740,arm_UI,arm742,arm_UI,arm744,arm_UI,arm746,arm_UI,  // 740
2724
+	arm740,arm_UI,arm742,arm_UI,arm744,arm_UI,arm746,arm_UI,  // 748
2725
+	arm750,arm_UI,arm752,arm_UI,arm754,arm_UI,arm756,arm_UI,  // 750
2726
+	arm750,arm_UI,arm752,arm_UI,arm754,arm_UI,arm756,arm_UI,  // 758
2727
+	arm760,arm_UI,arm762,arm_UI,arm764,arm_UI,arm766,arm_UI,  // 760
2728
+	arm760,arm_UI,arm762,arm_UI,arm764,arm_UI,arm766,arm_UI,  // 768
2729
+	arm770,arm_UI,arm772,arm_UI,arm774,arm_UI,arm776,arm_UI,  // 770
2730
+	arm770,arm_UI,arm772,arm_UI,arm774,arm_UI,arm776,arm_UI,  // 778
2731
+	arm780,arm_UI,arm782,arm_UI,arm784,arm_UI,arm786,arm_UI,  // 780
2732
+	arm780,arm_UI,arm782,arm_UI,arm784,arm_UI,arm786,arm_UI,  // 788
2733
+	arm790,arm_UI,arm792,arm_UI,arm794,arm_UI,arm796,arm_UI,  // 790
2734
+	arm790,arm_UI,arm792,arm_UI,arm794,arm_UI,arm796,arm_UI,  // 798
2735
+	arm7A0,arm_UI,arm7A2,arm_UI,arm7A4,arm_UI,arm7A6,arm_UI,  // 7A0
2736
+	arm7A0,arm_UI,arm7A2,arm_UI,arm7A4,arm_UI,arm7A6,arm_UI,  // 7A8
2737
+	arm7B0,arm_UI,arm7B2,arm_UI,arm7B4,arm_UI,arm7B6,arm_UI,  // 7B0
2738
+	arm7B0,arm_UI,arm7B2,arm_UI,arm7B4,arm_UI,arm7B6,arm_UI,  // 7B8
2739
+	arm7C0,arm_UI,arm7C2,arm_UI,arm7C4,arm_UI,arm7C6,arm_UI,  // 7C0
2740
+	arm7C0,arm_UI,arm7C2,arm_UI,arm7C4,arm_UI,arm7C6,arm_UI,  // 7C8
2741
+	arm7D0,arm_UI,arm7D2,arm_UI,arm7D4,arm_UI,arm7D6,arm_UI,  // 7D0
2742
+	arm7D0,arm_UI,arm7D2,arm_UI,arm7D4,arm_UI,arm7D6,arm_UI,  // 7D8
2743
+	arm7E0,arm_UI,arm7E2,arm_UI,arm7E4,arm_UI,arm7E6,arm_UI,  // 7E0
2744
+	arm7E0,arm_UI,arm7E2,arm_UI,arm7E4,arm_UI,arm7E6,arm_UI,  // 7E8
2745
+	arm7F0,arm_UI,arm7F2,arm_UI,arm7F4,arm_UI,arm7F6,arm_UI,  // 7F0
2746
+	arm7F0,arm_UI,arm7F2,arm_UI,arm7F4,arm_UI,arm7F6,arm_BP,  // 7F8
2747
+
2748
+	REP16(arm800),REP16(arm810),REP16(arm820),REP16(arm830),  // 800
2749
+	REP16(arm840),REP16(arm850),REP16(arm860),REP16(arm870),  // 840
2750
+	REP16(arm880),REP16(arm890),REP16(arm8A0),REP16(arm8B0),  // 880
2751
+	REP16(arm8C0),REP16(arm8D0),REP16(arm8E0),REP16(arm8F0),  // 8C0
2752
+	REP16(arm900),REP16(arm910),REP16(arm920),REP16(arm930),  // 900
2753
+	REP16(arm940),REP16(arm950),REP16(arm960),REP16(arm970),  // 940
2754
+	REP16(arm980),REP16(arm990),REP16(arm9A0),REP16(arm9B0),  // 980
2755
+	REP16(arm9C0),REP16(arm9D0),REP16(arm9E0),REP16(arm9F0),  // 9C0
2756
+
2757
+	REP256(armA00),                                           // A00
2758
+	REP256(armB00),                                           // B00
2759
+	REP256(arm_UI),                                           // C00
2760
+	REP256(arm_UI),                                           // D00
2761
+
2762
+	arm_UI,armE01,arm_UI,armE01,arm_UI,armE01,arm_UI,armE01,  // E00
2763
+	arm_UI,armE01,arm_UI,armE01,arm_UI,armE01,arm_UI,armE01,  // E08
2764
+	arm_UI,armE01,arm_UI,armE01,arm_UI,armE01,arm_UI,armE01,  // E10
2765
+	arm_UI,armE01,arm_UI,armE01,arm_UI,armE01,arm_UI,armE01,  // E18
2766
+	REP16(arm_UI),                                            // E20
2767
+	REP16(arm_UI),                                            // E30
2768
+	REP16(arm_UI),REP16(arm_UI),REP16(arm_UI),REP16(arm_UI),  // E40
2769
+	REP16(arm_UI),REP16(arm_UI),REP16(arm_UI),REP16(arm_UI),  // E80
2770
+	REP16(arm_UI),REP16(arm_UI),REP16(arm_UI),REP16(arm_UI),  // EC0
2771
+
2772
+	REP256(armF00),                                           // F00
2849 2773
 };
2850 2774
 
2851 2775
 // Wrapper routine (execution loop) ///////////////////////////////////////
2852 2776
 
2853
-#if 0
2854
-#include<time.h>
2855
-static void tester(void) {
2856
-  static int ran=0;if(ran)return;ran=1;
2857
-  FILE*f=fopen("p:\\timing.txt","w");if(!f)return;
2858
-  for (int op=/*0*/9; op</*0xF00*/10;op++){if(armInsnTable[op]==arm_UI)continue;
2859
-    int i;for(i=0;i<op;i++)if(armInsnTable[op]==armInsnTable[i])break;if(i<op)continue;
2860
-    for(i=0;i<16;i++)reg[i].I=0x3100000;
2861
-    clock_t s=clock();for(i=0;i<10000000;i++)armInsnTable[op](0);clock_t e=clock();
2862
-    fprintf(f,"arm%03X %6ld\n",op,e-s);fflush(f);
2863
-  }fclose(f);
2864
-}
2865
-#endif
2866
-
2867 2777
 int armExecute()
2868 2778
 {
2869
-    do {
2870
-		/*if( cheatsEnabled ) {
2871
-			cpuMasterCodeCheck();
2872
-		}*/
2873
-
2874
-        if ((armNextPC & 0x0803FFFF) == 0x08020000)
2875
-          busPrefetchCount = 0x100;
2876
-
2877
-        uint32_t opcode = cpuPrefetch[0];
2878
-        cpuPrefetch[0] = cpuPrefetch[1];
2879
-
2880
-        busPrefetch = false;
2881
-        if (busPrefetchCount & 0xFFFFFE00)
2882
-            busPrefetchCount = 0x100 | (busPrefetchCount & 0xFF);
2883
-
2884
-        clockTicks = 0;
2885
-        int oldArmNextPC = armNextPC;
2886
-
2887
-#ifndef FINAL_VERSION
2888
-        if (armNextPC == stop) {
2889
-            armNextPC++;
2890
-        }
2891
-#endif
2892
-
2893
-        armNextPC = reg[15].I;
2894
-        reg[15].I += 4;
2895
-        ARM_PREFETCH_NEXT;
2896
-
2897
-        int cond = opcode >> 28;
2898
-        bool cond_res = true;
2899
-        if (UNLIKELY(cond != 0x0E)) {  // most opcodes are AL (always)
2900
-            switch(cond) {
2901
-              case 0x00: // EQ
2902
-                cond_res = Z_FLAG;
2903
-                break;
2904
-              case 0x01: // NE
2905
-                cond_res = !Z_FLAG;
2906
-                break;
2907
-              case 0x02: // CS
2908
-                cond_res = C_FLAG;
2909
-                break;
2910
-              case 0x03: // CC
2911
-                cond_res = !C_FLAG;
2912
-                break;
2913
-              case 0x04: // MI
2914
-                cond_res = N_FLAG;
2915
-                break;
2916
-              case 0x05: // PL
2917
-                cond_res = !N_FLAG;
2918
-                break;
2919
-              case 0x06: // VS
2920
-                cond_res = V_FLAG;
2921
-                break;
2922
-              case 0x07: // VC
2923
-                cond_res = !V_FLAG;
2924
-                break;
2925
-              case 0x08: // HI
2926
-                cond_res = C_FLAG && !Z_FLAG;
2927
-                break;
2928
-              case 0x09: // LS
2929
-                cond_res = !C_FLAG || Z_FLAG;
2930
-                break;
2931
-              case 0x0A: // GE
2932
-                cond_res = N_FLAG == V_FLAG;
2933
-                break;
2934
-              case 0x0B: // LT
2935
-                cond_res = N_FLAG != V_FLAG;
2936
-                break;
2937
-              case 0x0C: // GT
2938
-                cond_res = !Z_FLAG &&(N_FLAG == V_FLAG);
2939
-                break;
2940
-              case 0x0D: // LE
2941
-                cond_res = Z_FLAG || (N_FLAG != V_FLAG);
2942
-                break;
2943
-              case 0x0E: // AL (impossible, checked above)
2944
-                cond_res = true;
2945
-                break;
2946
-              case 0x0F:
2947
-              default:
2948
-                // ???
2949
-                cond_res = false;
2950
-                break;
2951
-            }
2952
-        }
2953
-
2954
-        if (cond_res)
2955
-            (*armInsnTable[((opcode>>16)&0xFF0) | ((opcode>>4)&0x0F)])(opcode);
2956
-#ifdef INSN_COUNTER
2957
-        count(opcode, cond_res);
2958
-#endif
2959
-        if (clockTicks < 0)
2960
-            return 0;
2961
-        if (clockTicks == 0)
2962
-            clockTicks = 1 + codeTicksAccessSeq32(oldArmNextPC);
2963
-        cpuTotalTicks += clockTicks;
2964
-
2965
-    } while (cpuTotalTicks<cpuNextEvent && armState && !holdState && !SWITicks);
2966
-
2967
-    return 1;
2779
+	do
2780
+	{
2781
+		if ((armNextPC & 0x0803FFFF) == 0x08020000)
2782
+			busPrefetchCount = 0x100;
2783
+
2784
+		uint32_t opcode = cpuPrefetch[0];
2785
+		cpuPrefetch[0] = cpuPrefetch[1];
2786
+
2787
+		busPrefetch = false;
2788
+		if (busPrefetchCount & 0xFFFFFE00)
2789
+			busPrefetchCount = 0x100 | (busPrefetchCount & 0xFF);
2790
+
2791
+		clockTicks = 0;
2792
+		int oldArmNextPC = armNextPC;
2793
+
2794
+		armNextPC = reg[15].I;
2795
+		reg[15].I += 4;
2796
+		ARM_PREFETCH_NEXT();
2797
+
2798
+		int cond = opcode >> 28;
2799
+		bool cond_res = true;
2800
+		if (UNLIKELY(cond != 0x0E)) // most opcodes are AL (always)
2801
+		{
2802
+			switch (cond)
2803
+			{
2804
+				case 0x00: // EQ
2805
+					cond_res = Z_FLAG;
2806
+					break;
2807
+				case 0x01: // NE
2808
+					cond_res = !Z_FLAG;
2809
+					break;
2810
+				case 0x02: // CS
2811
+					cond_res = C_FLAG;
2812
+					break;
2813
+				case 0x03: // CC
2814
+					cond_res = !C_FLAG;
2815
+					break;
2816
+				case 0x04: // MI
2817
+					cond_res = N_FLAG;
2818
+					break;
2819
+				case 0x05: // PL
2820
+					cond_res = !N_FLAG;
2821
+					break;
2822
+				case 0x06: // VS
2823
+					cond_res = V_FLAG;
2824
+					break;
2825
+				case 0x07: // VC
2826
+					cond_res = !V_FLAG;
2827
+					break;
2828
+				case 0x08: // HI
2829
+					cond_res = C_FLAG && !Z_FLAG;
2830
+					break;
2831
+				case 0x09: // LS
2832
+					cond_res = !C_FLAG || Z_FLAG;
2833
+					break;
2834
+				case 0x0A: // GE
2835
+					cond_res = N_FLAG == V_FLAG;
2836
+					break;
2837
+				case 0x0B: // LT
2838
+					cond_res = N_FLAG != V_FLAG;
2839
+					break;
2840
+				case 0x0C: // GT
2841
+					cond_res = !Z_FLAG && N_FLAG == V_FLAG;
2842
+					break;
2843
+				case 0x0D: // LE
2844
+					cond_res = Z_FLAG || N_FLAG != V_FLAG;
2845
+					break;
2846
+				case 0x0E: // AL (impossible, checked above)
2847
+					cond_res = true;
2848
+					break;
2849
+				case 0x0F:
2850
+				default:
2851
+					// ???
2852
+					cond_res = false;
2853
+			}
2854
+		}
2855
+
2856
+		if (cond_res)
2857
+			(*armInsnTable[((opcode >> 16) & 0xFF0) | ((opcode >> 4) & 0x0F)])(opcode);
2858
+		if (clockTicks < 0)
2859
+			return 0;
2860
+		if (!clockTicks)
2861
+			clockTicks = 1 + codeTicksAccessSeq32(oldArmNextPC);
2862
+		cpuTotalTicks += clockTicks;
2863
+	} while (cpuTotalTicks < cpuNextEvent && armState && !holdState && !SWITicks);
2864
+
2865
+	return 1;
2968 2866
 }
Browse code

[GSF] Cleanup, a tiny bit of making sure it was like viogsf, also used the standard integer types and not VBA-M's typedefs.

Naram Qashat authored on 2013/05/10 17:45:36
Showing 1 changed files
... ...
@@ -35,7 +35,7 @@
35 35
 
36 36
 static int clockTicks;
37 37
 
38
-static INSN_REGPARM void armUnknownInsn(u32 opcode)
38
+static INSN_REGPARM void armUnknownInsn(uint32_t opcode)
39 39
 {
40 40
 #ifdef GBA_LOGGING
41 41
     if (systemVerbose & VERBOSE_UNDEFINED) {
... ...
@@ -47,7 +47,7 @@ static INSN_REGPARM void armUnknownInsn(u32 opcode)
47 47
 }
48 48
 
49 49
 #ifdef BKPT_SUPPORT
50
-static INSN_REGPARM void armBreakpoint(u32 opcode)
50
+static INSN_REGPARM void armBreakpoint(uint32_t opcode)
51 51
 {
52 52
     reg[15].I -= 4;
53 53
     armNextPC -= 4;
... ...
@@ -60,7 +60,7 @@ static INSN_REGPARM void armBreakpoint(u32 opcode)
60 60
 // Subroutine to count instructions (for debugging/optimizing)
61 61
 //#define INSN_COUNTER  // comment out if you don't want it
62 62
 #ifdef INSN_COUNTER
63
-static void count(u32 opcode, int cond_res)
63
+static void count(uint32_t opcode, int cond_res)
64 64
 {
65 65
     static int insncount = 0;    // number of insns seen
66 66
     static int executed = 0;     // number of insns executed
... ...
@@ -716,11 +716,11 @@ static void count(u32 opcode, int cond_res)
716 716
 // C core
717 717
 
718 718
 #define C_SETCOND_LOGICAL \
719
-    N_FLAG = ((s32)res < 0) ? true : false;             \
719
+    N_FLAG = ((int32_t)res < 0) ? true : false;             \
720 720
     Z_FLAG = (res == 0) ? true : false;                 \
721 721
     C_FLAG = C_OUT;
722 722
 #define C_SETCOND_ADD \
723
-    N_FLAG = ((s32)res < 0) ? true : false;             \
723
+    N_FLAG = ((int32_t)res < 0) ? true : false;             \
724 724
     Z_FLAG = (res == 0) ? true : false;                 \
725 725
     V_FLAG = ((NEG(lhs) & NEG(rhs) & POS(res)) |        \
726 726
               (POS(lhs) & POS(rhs) & NEG(res))) ? true : false;\
... ...
@@ -728,7 +728,7 @@ static void count(u32 opcode, int cond_res)
728 728
               (NEG(lhs) & POS(res)) |                   \
729 729
               (NEG(rhs) & POS(res))) ? true : false;
730 730
 #define C_SETCOND_SUB \
731
-    N_FLAG = ((s32)res < 0) ? true : false;             \
731
+    N_FLAG = ((int32_t)res < 0) ? true : false;             \
732 732
     Z_FLAG = (res == 0) ? true : false;                 \
733 733
     V_FLAG = ((NEG(lhs) & POS(rhs) & POS(res)) |        \
734 734
               (POS(lhs) & NEG(rhs) & NEG(res))) ? true : false;\
... ...
@@ -740,7 +740,7 @@ static void count(u32 opcode, int cond_res)
740 740
  #define ALU_INIT_C \
741 741
     int dest = (opcode>>12) & 15;                       \
742 742
     bool C_OUT = C_FLAG;                                \
743
-    u32 value;
743
+    uint32_t value;
744 744
 #endif
745 745
 // OP Rd,Rb,Rm LSL #
746 746
 #ifndef VALUE_LSL_IMM_C
... ...
@@ -749,7 +749,7 @@ static void count(u32 opcode, int cond_res)
749 749
     if (LIKELY(!shift)) {  /* LSL #0 most common? */    \
750 750
         value = reg[opcode & 0x0F].I;                   \
751 751
     } else {                                            \
752
-        u32 v = reg[opcode & 0x0F].I;                   \
752
+        uint32_t v = reg[opcode & 0x0F].I;                   \
753 753
         C_OUT = (v >> (32 - shift)) & 1 ? true : false; \
754 754
         value = v << shift;                             \
755 755
     }
... ...
@@ -757,8 +757,8 @@ static void count(u32 opcode, int cond_res)
757 757
 // OP Rd,Rb,Rm LSL Rs
758 758
 #ifndef VALUE_LSL_REG_C
759 759
  #define VALUE_LSL_REG_C \
760
-    u32 shift = reg[(opcode >> 8)&15].B.B0;                  \
761
-    u32 rm = reg[opcode & 0x0F].I;                           \
760
+    uint32_t shift = reg[(opcode >> 8)&15].B.B0;                  \
761
+    uint32_t rm = reg[opcode & 0x0F].I;                           \
762 762
     if((opcode & 0x0F) == 15) {                              \
763 763
         rm += 4;                                             \
764 764
     }                                                        \
... ...
@@ -767,7 +767,7 @@ static void count(u32 opcode, int cond_res)
767 767
             value = 0;                                  \
768 768
             C_OUT = (rm & 1 ? true : false);                 \
769 769
         } else if (LIKELY(shift < 32)) {                \
770
-            u32 v = rm;                                      \
770
+            uint32_t v = rm;                                      \
771 771
             C_OUT = (v >> (32 - shift)) & 1 ? true : false;\
772 772
             value = v << shift;                         \
773 773
         } else {                                        \
... ...
@@ -781,9 +781,9 @@ static void count(u32 opcode, int cond_res)
781 781
 // OP Rd,Rb,Rm LSR #
782 782
 #ifndef VALUE_LSR_IMM_C
783 783
  #define VALUE_LSR_IMM_C \
784
-    u32 shift = (opcode >> 7) & 0x1F;                   \
784
+    uint32_t shift = (opcode >> 7) & 0x1F;                   \
785 785
     if (LIKELY(shift)) {                                \
786
-        u32 v = reg[opcode & 0x0F].I;                   \
786
+        uint32_t v = reg[opcode & 0x0F].I;                   \
787 787
         C_OUT = (v >> (shift - 1)) & 1 ? true : false;  \
788 788
         value = v >> shift;                             \
789 789
     } else {                                            \
... ...
@@ -795,7 +795,7 @@ static void count(u32 opcode, int cond_res)
795 795
 #ifndef VALUE_LSR_REG_C
796 796
  #define VALUE_LSR_REG_C \
797 797
     unsigned int shift = reg[(opcode >> 8)&15].B.B0;    \
798
-    u32 rm = reg[opcode & 0x0F].I;                      \
798
+    uint32_t rm = reg[opcode & 0x0F].I;                      \
799 799
     if((opcode & 0x0F) == 15) {                         \
800 800
         rm += 4;                                            \
801 801
     }                                                   \
... ...
@@ -804,7 +804,7 @@ static void count(u32 opcode, int cond_res)
804 804
             value = 0;                                  \
805 805
             C_OUT = (rm & 0x80000000 ? true : false);\
806 806
         } else if (LIKELY(shift < 32)) {                \
807
-            u32 v = rm;               \
807
+            uint32_t v = rm;               \
808 808
             C_OUT = (v >> (shift - 1)) & 1 ? true : false;\
809 809
             value = v >> shift;                         \
810 810
         } else {                                        \
... ...
@@ -821,7 +821,7 @@ static void count(u32 opcode, int cond_res)
821 821
     unsigned int shift = (opcode >> 7) & 0x1F;          \
822 822
     if (LIKELY(shift)) {                                \
823 823
         /* VC++ BUG: u32 v; (s32)v>>n is optimized to shr! */ \
824
-        s32 v = reg[opcode & 0x0F].I;                   \
824
+        int32_t v = reg[opcode & 0x0F].I;                   \
825 825
         C_OUT = (v >> (int)(shift - 1)) & 1 ? true : false;\
826 826
         value = v >> (int)shift;                        \
827 827
     } else {                                            \
... ...
@@ -838,13 +838,13 @@ static void count(u32 opcode, int cond_res)
838 838
 #ifndef VALUE_ASR_REG_C
839 839
  #define VALUE_ASR_REG_C \
840 840
     unsigned int shift = reg[(opcode >> 8)&15].B.B0;    \
841
-    u32 rm = reg[opcode & 0x0F].I;                      \
841
+    uint32_t rm = reg[opcode & 0x0F].I;                      \
842 842
     if((opcode & 0x0F) == 15) {                         \
843 843
         rm += 4;                                            \
844 844
     }                                                   \
845 845
     if (LIKELY(shift < 32)) {                           \
846 846
         if (LIKELY(shift)) {                            \
847
-            s32 v = rm;               \
847
+            int32_t v = rm;               \
848 848
             C_OUT = (v >> (int)(shift - 1)) & 1 ? true : false;\
849 849
             value = v >> (int)shift;                    \
850 850
         } else {                                        \
... ...
@@ -865,12 +865,12 @@ static void count(u32 opcode, int cond_res)
865 865
  #define VALUE_ROR_IMM_C \
866 866
     unsigned int shift = (opcode >> 7) & 0x1F;          \
867 867
     if (LIKELY(shift)) {                                \
868
-        u32 v = reg[opcode & 0x0F].I;                   \
868
+        uint32_t v = reg[opcode & 0x0F].I;                   \
869 869
         C_OUT = (v >> (shift - 1)) & 1 ? true : false;  \
870 870
         value = ((v << (32 - shift)) |                  \
871 871
                  (v >> shift));                         \
872 872
     } else {                                            \
873
-        u32 v = reg[opcode & 0x0F].I;                   \
873
+        uint32_t v = reg[opcode & 0x0F].I;                   \
874 874
         C_OUT = (v & 1) ? true : false;                 \
875 875
         value = ((v >> 1) |                             \
876 876
                  (C_FLAG << 31));                       \
... ...
@@ -880,12 +880,12 @@ static void count(u32 opcode, int cond_res)
880 880
 #ifndef VALUE_ROR_REG_C
881 881
  #define VALUE_ROR_REG_C \
882 882
     unsigned int shift = reg[(opcode >> 8)&15].B.B0;    \
883
-    u32 rm = reg[opcode & 0x0F].I;                      \
883
+    uint32_t rm = reg[opcode & 0x0F].I;                      \
884 884
     if((opcode & 0x0F) == 15) {                         \
885 885
         rm += 4;                                            \
886 886
     }                                                   \
887 887
     if (LIKELY(shift & 0x1F)) {                         \
888
-        u32 v = rm;                   \
888
+        uint32_t v = rm;                   \
889 889
         C_OUT = (v >> (shift - 1)) & 1 ? true : false;  \
890 890
         value = ((v << (32 - shift)) |                  \
891 891
                  (v >> shift));                         \
... ...
@@ -900,7 +900,7 @@ static void count(u32 opcode, int cond_res)
900 900
  #define VALUE_IMM_C \
901 901
     int shift = (opcode & 0xF00) >> 7;                  \
902 902
     if (UNLIKELY(shift)) {                              \
903
-        u32 v = opcode & 0xFF;                          \
903
+        uint32_t v = opcode & 0xFF;                          \
904 904
         C_OUT = (v >> (shift - 1)) & 1 ? true : false;  \
905 905
         value = ((v << (32 - shift)) |                  \
906 906
                  (v >> shift));                         \
... ...
@@ -945,7 +945,7 @@ static void count(u32 opcode, int cond_res)
945 945
 #define C_CHECK_PC(SETCOND) if (LIKELY(dest != 15)) { SETCOND }
946 946
 #ifndef OP_AND
947 947
  #define OP_AND \
948
-    u32 res = reg[(opcode>>16)&15].I & value;           \
948
+    uint32_t res = reg[(opcode>>16)&15].I & value;           \
949 949
     reg[dest].I = res;
950 950
 #endif
951 951
 #ifndef OP_ANDS
... ...
@@ -953,7 +953,7 @@ static void count(u32 opcode, int cond_res)
953 953
 #endif
954 954
 #ifndef OP_EOR
955 955
  #define OP_EOR \
956
-    u32 res = reg[(opcode>>16)&15].I ^ value;           \
956
+    uint32_t res = reg[(opcode>>16)&15].I ^ value;           \
957 957
     reg[dest].I = res;
958 958
 #endif
959 959
 #ifndef OP_EORS
... ...
@@ -961,9 +961,9 @@ static void count(u32 opcode, int cond_res)
961 961
 #endif
962 962
 #ifndef OP_SUB
963 963
  #define OP_SUB \
964
-    u32 lhs = reg[(opcode>>16)&15].I;                   \
965
-    u32 rhs = value;                                    \
966
-    u32 res = lhs - rhs;                                \
964
+    uint32_t lhs = reg[(opcode>>16)&15].I;                   \
965
+    uint32_t rhs = value;                                    \
966
+    uint32_t res = lhs - rhs;                                \
967 967
     reg[dest].I = res;
968 968
 #endif
969 969
 #ifndef OP_SUBS
... ...
@@ -971,9 +971,9 @@ static void count(u32 opcode, int cond_res)
971 971
 #endif
972 972
 #ifndef OP_RSB
973 973
  #define OP_RSB \
974
-    u32 lhs = value;                                    \
975
-    u32 rhs = reg[(opcode>>16)&15].I;                   \
976
-    u32 res = lhs - rhs;                                \
974
+    uint32_t lhs = value;                                    \
975
+    uint32_t rhs = reg[(opcode>>16)&15].I;                   \
976
+    uint32_t res = lhs - rhs;                                \
977 977
     reg[dest].I = res;
978 978
 #endif
979 979
 #ifndef OP_RSBS
... ...
@@ -981,9 +981,9 @@ static void count(u32 opcode, int cond_res)
981 981
 #endif
982 982
 #ifndef OP_ADD
983 983
  #define OP_ADD \
984
-    u32 lhs = reg[(opcode>>16)&15].I;                   \
985
-    u32 rhs = value;                                    \
986
-    u32 res = lhs + rhs;                                \
984
+    uint32_t lhs = reg[(opcode>>16)&15].I;                   \
985
+    uint32_t rhs = value;                                    \
986
+    uint32_t res = lhs + rhs;                                \
987 987
     reg[dest].I = res;
988 988
 #endif
989 989
 #ifndef OP_ADDS
... ...
@@ -991,9 +991,9 @@ static void count(u32 opcode, int cond_res)
991 991
 #endif
992 992
 #ifndef OP_ADC
993 993
  #define OP_ADC \
994
-    u32 lhs = reg[(opcode>>16)&15].I;                   \
995
-    u32 rhs = value;                                    \
996
-    u32 res = lhs + rhs + (u32)C_FLAG;                  \
994
+    uint32_t lhs = reg[(opcode>>16)&15].I;                   \
995
+    uint32_t rhs = value;                                    \
996
+    uint32_t res = lhs + rhs + (uint32_t)C_FLAG;                  \
997 997
     reg[dest].I = res;
998 998
 #endif
999 999
 #ifndef OP_ADCS
... ...
@@ -1001,9 +1001,9 @@ static void count(u32 opcode, int cond_res)
1001 1001
 #endif
1002 1002
 #ifndef OP_SBC
1003 1003
  #define OP_SBC \
1004
-    u32 lhs = reg[(opcode>>16)&15].I;                   \
1005
-    u32 rhs = value;                                    \
1006
-    u32 res = lhs - rhs - !((u32)C_FLAG);               \
1004
+    uint32_t lhs = reg[(opcode>>16)&15].I;                   \
1005
+    uint32_t rhs = value;                                    \
1006
+    uint32_t res = lhs - rhs - !((uint32_t)C_FLAG);               \
1007 1007
     reg[dest].I = res;
1008 1008
 #endif
1009 1009
 #ifndef OP_SBCS
... ...
@@ -1011,9 +1011,9 @@ static void count(u32 opcode, int cond_res)
1011 1011
 #endif
1012 1012
 #ifndef OP_RSC
1013 1013
  #define OP_RSC \
1014
-    u32 lhs = value;                                    \
1015
-    u32 rhs = reg[(opcode>>16)&15].I;                   \
1016
-    u32 res = lhs - rhs - !((u32)C_FLAG);               \
1014
+    uint32_t lhs = value;                                    \
1015
+    uint32_t rhs = reg[(opcode>>16)&15].I;                   \
1016
+    uint32_t res = lhs - rhs - !((uint32_t)C_FLAG);               \
1017 1017
     reg[dest].I = res;
1018 1018
 #endif
1019 1019
 #ifndef OP_RSCS
... ...
@@ -1021,31 +1021,31 @@ static void count(u32 opcode, int cond_res)
1021 1021
 #endif
1022 1022
 #ifndef OP_TST
1023 1023
  #define OP_TST \
1024
-    u32 res = reg[(opcode >> 16) & 0x0F].I & value;     \
1024
+    uint32_t res = reg[(opcode >> 16) & 0x0F].I & value;     \
1025 1025
     C_SETCOND_LOGICAL;
1026 1026
 #endif
1027 1027
 #ifndef OP_TEQ
1028 1028
  #define OP_TEQ \
1029
-    u32 res = reg[(opcode >> 16) & 0x0F].I ^ value;     \
1029
+    uint32_t res = reg[(opcode >> 16) & 0x0F].I ^ value;     \
1030 1030
     C_SETCOND_LOGICAL;
1031 1031
 #endif
1032 1032
 #ifndef OP_CMP
1033 1033
  #define OP_CMP \
1034
-    u32 lhs = reg[(opcode>>16)&15].I;                   \
1035
-    u32 rhs = value;                                    \
1036
-    u32 res = lhs - rhs;                                \
1034
+    uint32_t lhs = reg[(opcode>>16)&15].I;                   \
1035
+    uint32_t rhs = value;                                    \
1036
+    uint32_t res = lhs - rhs;                                \
1037 1037
     C_SETCOND_SUB;
1038 1038
 #endif
1039 1039
 #ifndef OP_CMN
1040 1040
  #define OP_CMN \
1041
-    u32 lhs = reg[(opcode>>16)&15].I;                   \
1042
-    u32 rhs = value;                                    \
1043
-    u32 res = lhs + rhs;                                \
1041
+    uint32_t lhs = reg[(opcode>>16)&15].I;                   \
1042
+    uint32_t rhs = value;                                    \
1043
+    uint32_t res = lhs + rhs;                                \
1044 1044
     C_SETCOND_ADD;
1045 1045
 #endif
1046 1046
 #ifndef OP_ORR
1047 1047
  #define OP_ORR \
1048
-    u32 res = reg[(opcode >> 16) & 0x0F].I | value;     \
1048
+    uint32_t res = reg[(opcode >> 16) & 0x0F].I | value;     \
1049 1049
     reg[dest].I = res;
1050 1050
 #endif
1051 1051
 #ifndef OP_ORRS
... ...
@@ -1053,7 +1053,7 @@ static void count(u32 opcode, int cond_res)
1053 1053
 #endif
1054 1054
 #ifndef OP_MOV
1055 1055
  #define OP_MOV \
1056
-    u32 res = value;                                    \
1056
+    uint32_t res = value;                                    \
1057 1057
     reg[dest].I = res;
1058 1058
 #endif
1059 1059
 #ifndef OP_MOVS
... ...
@@ -1061,7 +1061,7 @@ static void count(u32 opcode, int cond_res)
1061 1061
 #endif
1062 1062
 #ifndef OP_BIC
1063 1063
  #define OP_BIC \
1064
-    u32 res = reg[(opcode >> 16) & 0x0F].I & (~value);  \
1064
+    uint32_t res = reg[(opcode >> 16) & 0x0F].I & (~value);  \
1065 1065
     reg[dest].I = res;
1066 1066
 #endif
1067 1067
 #ifndef OP_BICS
... ...
@@ -1069,7 +1069,7 @@ static void count(u32 opcode, int cond_res)
1069 1069
 #endif
1070 1070
 #ifndef OP_MVN
1071 1071
  #define OP_MVN \
1072
-    u32 res = ~value;                                   \
1072
+    uint32_t res = ~value;                                   \
1073 1073
     reg[dest].I = res;
1074 1074
 #endif
1075 1075
 #ifndef OP_MVNS
... ...
@@ -1081,7 +1081,7 @@ static void count(u32 opcode, int cond_res)
1081 1081
 #endif
1082 1082
 #ifndef SETCOND_MUL
1083 1083
  #define SETCOND_MUL \
1084
-     N_FLAG = ((s32)reg[dest].I < 0) ? true : false;    \
1084
+     N_FLAG = ((int32_t)reg[dest].I < 0) ? true : false;    \
1085 1085
      Z_FLAG = reg[dest].I ? false : true;
1086 1086
 #endif
1087 1087
 #ifndef SETCOND_MULL
... ...
@@ -1096,7 +1096,7 @@ static void count(u32 opcode, int cond_res)
1096 1096
 
1097 1097
 #ifndef ROR_IMM_MSR
1098 1098
  #define ROR_IMM_MSR \
1099
-    u32 v = opcode & 0xff;                              \
1099
+    uint32_t v = opcode & 0xff;                              \
1100 1100
     value = ((v << (32 - shift)) | (v >> shift));
1101 1101
 #endif
1102 1102
 #ifndef ROR_OFFSET
... ...
@@ -1144,25 +1144,25 @@ static void count(u32 opcode, int cond_res)
1144 1144
 #define MODECHANGE_YES CPUSwitchMode(reg[17].I & 0x1f, false);
1145 1145
 
1146 1146
 #define DEFINE_ALU_INSN_C(CODE1, CODE2, OP, MODECHANGE) \
1147
-  static INSN_REGPARM void arm##CODE1##0(u32 opcode) { ALU_INSN(ALU_INIT_C, VALUE_LSL_IMM_C, OP_##OP, MODECHANGE_##MODECHANGE, 0); }\
1148
-  static INSN_REGPARM void arm##CODE1##1(u32 opcode) { ALU_INSN(ALU_INIT_C, VALUE_LSL_REG_C, OP_##OP, MODECHANGE_##MODECHANGE, 1); }\
1149
-  static INSN_REGPARM void arm##CODE1##2(u32 opcode) { ALU_INSN(ALU_INIT_C, VALUE_LSR_IMM_C, OP_##OP, MODECHANGE_##MODECHANGE, 0); }\
1150
-  static INSN_REGPARM void arm##CODE1##3(u32 opcode) { ALU_INSN(ALU_INIT_C, VALUE_LSR_REG_C, OP_##OP, MODECHANGE_##MODECHANGE, 1); }\
1151
-  static INSN_REGPARM void arm##CODE1##4(u32 opcode) { ALU_INSN(ALU_INIT_C, VALUE_ASR_IMM_C, OP_##OP, MODECHANGE_##MODECHANGE, 0); }\
1152
-  static INSN_REGPARM void arm##CODE1##5(u32 opcode) { ALU_INSN(ALU_INIT_C, VALUE_ASR_REG_C, OP_##OP, MODECHANGE_##MODECHANGE, 1); }\
1153
-  static INSN_REGPARM void arm##CODE1##6(u32 opcode) { ALU_INSN(ALU_INIT_C, VALUE_ROR_IMM_C, OP_##OP, MODECHANGE_##MODECHANGE, 0); }\
1154
-  static INSN_REGPARM void arm##CODE1##7(u32 opcode) { ALU_INSN(ALU_INIT_C, VALUE_ROR_REG_C, OP_##OP, MODECHANGE_##MODECHANGE, 1); }\
1155
-  static INSN_REGPARM void arm##CODE2##0(u32 opcode) { ALU_INSN(ALU_INIT_C, VALUE_IMM_C,     OP_##OP, MODECHANGE_##MODECHANGE, 0); }
1147
+  static INSN_REGPARM void arm##CODE1##0(uint32_t opcode) { ALU_INSN(ALU_INIT_C, VALUE_LSL_IMM_C, OP_##OP, MODECHANGE_##MODECHANGE, 0); }\
1148
+  static INSN_REGPARM void arm##CODE1##1(uint32_t opcode) { ALU_INSN(ALU_INIT_C, VALUE_LSL_REG_C, OP_##OP, MODECHANGE_##MODECHANGE, 1); }\
1149
+  static INSN_REGPARM void arm##CODE1##2(uint32_t opcode) { ALU_INSN(ALU_INIT_C, VALUE_LSR_IMM_C, OP_##OP, MODECHANGE_##MODECHANGE, 0); }\
1150
+  static INSN_REGPARM void arm##CODE1##3(uint32_t opcode) { ALU_INSN(ALU_INIT_C, VALUE_LSR_REG_C, OP_##OP, MODECHANGE_##MODECHANGE, 1); }\
1151
+  static INSN_REGPARM void arm##CODE1##4(uint32_t opcode) { ALU_INSN(ALU_INIT_C, VALUE_ASR_IMM_C, OP_##OP, MODECHANGE_##MODECHANGE, 0); }\
1152
+  static INSN_REGPARM void arm##CODE1##5(uint32_t opcode) { ALU_INSN(ALU_INIT_C, VALUE_ASR_REG_C, OP_##OP, MODECHANGE_##MODECHANGE, 1); }\
1153
+  static INSN_REGPARM void arm##CODE1##6(uint32_t opcode) { ALU_INSN(ALU_INIT_C, VALUE_ROR_IMM_C, OP_##OP, MODECHANGE_##MODECHANGE, 0); }\
1154
+  static INSN_REGPARM void arm##CODE1##7(uint32_t opcode) { ALU_INSN(ALU_INIT_C, VALUE_ROR_REG_C, OP_##OP, MODECHANGE_##MODECHANGE, 1); }\
1155
+  static INSN_REGPARM void arm##CODE2##0(uint32_t opcode) { ALU_INSN(ALU_INIT_C, VALUE_IMM_C,     OP_##OP, MODECHANGE_##MODECHANGE, 0); }
1156 1156
 #define DEFINE_ALU_INSN_NC(CODE1, CODE2, OP, MODECHANGE) \
1157
-  static INSN_REGPARM void arm##CODE1##0(u32 opcode) { ALU_INSN(ALU_INIT_NC, VALUE_LSL_IMM_NC, OP_##OP, MODECHANGE_##MODECHANGE, 0); }\
1158
-  static INSN_REGPARM void arm##CODE1##1(u32 opcode) { ALU_INSN(ALU_INIT_NC, VALUE_LSL_REG_NC, OP_##OP, MODECHANGE_##MODECHANGE, 1); }\
1159
-  static INSN_REGPARM void arm##CODE1##2(u32 opcode) { ALU_INSN(ALU_INIT_NC, VALUE_LSR_IMM_NC, OP_##OP, MODECHANGE_##MODECHANGE, 0); }\
1160
-  static INSN_REGPARM void arm##CODE1##3(u32 opcode) { ALU_INSN(ALU_INIT_NC, VALUE_LSR_REG_NC, OP_##OP, MODECHANGE_##MODECHANGE, 1); }\
1161
-  static INSN_REGPARM void arm##CODE1##4(u32 opcode) { ALU_INSN(ALU_INIT_NC, VALUE_ASR_IMM_NC, OP_##OP, MODECHANGE_##MODECHANGE, 0); }\
1162
-  static INSN_REGPARM void arm##CODE1##5(u32 opcode) { ALU_INSN(ALU_INIT_NC, VALUE_ASR_REG_NC, OP_##OP, MODECHANGE_##MODECHANGE, 1); }\
1163
-  static INSN_REGPARM void arm##CODE1##6(u32 opcode) { ALU_INSN(ALU_INIT_NC, VALUE_ROR_IMM_NC, OP_##OP, MODECHANGE_##MODECHANGE, 0); }\
1164
-  static INSN_REGPARM void arm##CODE1##7(u32 opcode) { ALU_INSN(ALU_INIT_NC, VALUE_ROR_REG_NC, OP_##OP, MODECHANGE_##MODECHANGE, 1); }\
1165
-  static INSN_REGPARM void arm##CODE2##0(u32 opcode) { ALU_INSN(ALU_INIT_NC, VALUE_IMM_NC,     OP_##OP, MODECHANGE_##MODECHANGE, 0); }
1157
+  static INSN_REGPARM void arm##CODE1##0(uint32_t opcode) { ALU_INSN(ALU_INIT_NC, VALUE_LSL_IMM_NC, OP_##OP, MODECHANGE_##MODECHANGE, 0); }\
1158
+  static INSN_REGPARM void arm##CODE1##1(uint32_t opcode) { ALU_INSN(ALU_INIT_NC, VALUE_LSL_REG_NC, OP_##OP, MODECHANGE_##MODECHANGE, 1); }\
1159
+  static INSN_REGPARM void arm##CODE1##2(uint32_t opcode) { ALU_INSN(ALU_INIT_NC, VALUE_LSR_IMM_NC, OP_##OP, MODECHANGE_##MODECHANGE, 0); }\
1160
+  static INSN_REGPARM void arm##CODE1##3(uint32_t opcode) { ALU_INSN(ALU_INIT_NC, VALUE_LSR_REG_NC, OP_##OP, MODECHANGE_##MODECHANGE, 1); }\
1161
+  static INSN_REGPARM void arm##CODE1##4(uint32_t opcode) { ALU_INSN(ALU_INIT_NC, VALUE_ASR_IMM_NC, OP_##OP, MODECHANGE_##MODECHANGE, 0); }\
1162
+  static INSN_REGPARM void arm##CODE1##5(uint32_t opcode) { ALU_INSN(ALU_INIT_NC, VALUE_ASR_REG_NC, OP_##OP, MODECHANGE_##MODECHANGE, 1); }\
1163
+  static INSN_REGPARM void arm##CODE1##6(uint32_t opcode) { ALU_INSN(ALU_INIT_NC, VALUE_ROR_IMM_NC, OP_##OP, MODECHANGE_##MODECHANGE, 0); }\
1164
+  static INSN_REGPARM void arm##CODE1##7(uint32_t opcode) { ALU_INSN(ALU_INIT_NC, VALUE_ROR_REG_NC, OP_##OP, MODECHANGE_##MODECHANGE, 1); }\
1165
+  static INSN_REGPARM void arm##CODE2##0(uint32_t opcode) { ALU_INSN(ALU_INIT_NC, VALUE_IMM_NC,     OP_##OP, MODECHANGE_##MODECHANGE, 0); }
1166 1166
 
1167 1167
 // AND
1168 1168
 DEFINE_ALU_INSN_NC(00, 20, AND,  NO)
... ...
@@ -1243,12 +1243,12 @@ DEFINE_ALU_INSN_C (1F, 3F, MVNS, YES)
1243 1243
 // CYCLES: base cycle count (1, 2, or 3)
1244 1244
 #define MUL_INSN(OP, SETCOND, CYCLES) \
1245 1245
     int mult = (opcode & 0x0F);                         \
1246
-    u32 rs = reg[(opcode >> 8) & 0x0F].I;               \
1246
+    uint32_t rs = reg[(opcode >> 8) & 0x0F].I;               \
1247 1247
     int acc = (opcode >> 12) & 0x0F;   /* or destLo */  \
1248 1248
     int dest = (opcode >> 16) & 0x0F;  /* or destHi */  \
1249 1249
     OP;                                                 \
1250 1250
     SETCOND;                                            \
1251
-    if ((s32)rs < 0)                                    \
1251
+    if ((int32_t)rs < 0)                                    \
1252 1252
         rs = ~rs;                                       \
1253 1253
     if ((rs & 0xFFFFFF00) == 0)                         \
1254 1254
         clockTicks += 0;                                \
... ...
@@ -1267,58 +1267,58 @@ DEFINE_ALU_INSN_C (1F, 3F, MVNS, YES)
1267 1267
 #define OP_MLA \
1268 1268
     reg[dest].I = reg[mult].I * rs + reg[acc].I;
1269 1269
 #define OP_MULL(SIGN) \
1270
-    SIGN##64 res = (SIGN##64)(SIGN##32)reg[mult].I      \
1271
-                 * (SIGN##64)(SIGN##32)rs;              \
1272
-    reg[acc].I = (u32)res;                              \
1273
-    reg[dest].I = (u32)(res >> 32);
1270
+    SIGN##64_t res = (SIGN##64_t)(SIGN##32_t)reg[mult].I      \
1271
+                 * (SIGN##64_t)(SIGN##32_t)rs;              \
1272
+    reg[acc].I = (uint32_t)res;                              \
1273
+    reg[dest].I = (uint32_t)(res >> 32);
1274 1274
 #define OP_MLAL(SIGN) \
1275
-    SIGN##64 res = ((SIGN##64)reg[dest].I<<32 | reg[acc].I)\
1276
-                 + ((SIGN##64)(SIGN##32)reg[mult].I     \
1277
-                    * (SIGN##64)(SIGN##32)rs);          \
1278
-    reg[acc].I = (u32)res;                              \
1279
-    reg[dest].I = (u32)(res >> 32);
1280
-#define OP_UMULL OP_MULL(u)
1281
-#define OP_UMLAL OP_MLAL(u)
1282
-#define OP_SMULL OP_MULL(s)
1283
-#define OP_SMLAL OP_MLAL(s)
1275
+    SIGN##64_t res = ((SIGN##64_t)reg[dest].I<<32 | reg[acc].I)\
1276
+                 + ((SIGN##64_t)(SIGN##32_t)reg[mult].I     \
1277
+                    * (SIGN##64_t)(SIGN##32_t)rs);          \
1278
+    reg[acc].I = (uint32_t)res;                              \
1279
+    reg[dest].I = (uint32_t)(res >> 32);
1280
+#define OP_UMULL OP_MULL(uint)
1281
+#define OP_UMLAL OP_MLAL(uint)
1282
+#define OP_SMULL OP_MULL(int)
1283
+#define OP_SMLAL OP_MLAL(int)
1284 1284
 
1285 1285
 // MUL Rd, Rm, Rs
1286
-static INSN_REGPARM void arm009(u32 opcode) { MUL_INSN(OP_MUL, SETCOND_NONE, 1); }
1286
+static INSN_REGPARM void arm009(uint32_t opcode) { MUL_INSN(OP_MUL, SETCOND_NONE, 1); }
1287 1287
 // MULS Rd, Rm, Rs
1288
-static INSN_REGPARM void arm019(u32 opcode) { MUL_INSN(OP_MUL, SETCOND_MUL, 1); }
1288
+static INSN_REGPARM void arm019(uint32_t opcode) { MUL_INSN(OP_MUL, SETCOND_MUL, 1); }
1289 1289
 
1290 1290
 // MLA Rd, Rm, Rs, Rn
1291
-static INSN_REGPARM void arm029(u32 opcode) { MUL_INSN(OP_MLA, SETCOND_NONE, 2); }
1291
+static INSN_REGPARM void arm029(uint32_t opcode) { MUL_INSN(OP_MLA, SETCOND_NONE, 2); }
1292 1292
 // MLAS Rd, Rm, Rs, Rn
1293
-static INSN_REGPARM void arm039(u32 opcode) { MUL_INSN(OP_MLA, SETCOND_MUL, 2); }
1293
+static INSN_REGPARM void arm039(uint32_t opcode) { MUL_INSN(OP_MLA, SETCOND_MUL, 2); }
1294 1294
 
1295 1295
 // UMULL RdLo, RdHi, Rn, Rs
1296
-static INSN_REGPARM void arm089(u32 opcode) { MUL_INSN(OP_UMULL, SETCOND_NONE, 2); }
1296
+static INSN_REGPARM void arm089(uint32_t opcode) { MUL_INSN(OP_UMULL, SETCOND_NONE, 2); }
1297 1297
 // UMULLS RdLo, RdHi, Rn, Rs
1298
-static INSN_REGPARM void arm099(u32 opcode) { MUL_INSN(OP_UMULL, SETCOND_MULL, 2); }
1298
+static INSN_REGPARM void arm099(uint32_t opcode) { MUL_INSN(OP_UMULL, SETCOND_MULL, 2); }
1299 1299
 
1300 1300
 // UMLAL RdLo, RdHi, Rn, Rs
1301
-static INSN_REGPARM void arm0A9(u32 opcode) { MUL_INSN(OP_UMLAL, SETCOND_NONE, 3); }
1301
+static INSN_REGPARM void arm0A9(uint32_t opcode) { MUL_INSN(OP_UMLAL, SETCOND_NONE, 3); }
1302 1302
 // UMLALS RdLo, RdHi, Rn, Rs
1303
-static INSN_REGPARM void arm0B9(u32 opcode) { MUL_INSN(OP_UMLAL, SETCOND_MULL, 3); }
1303
+static INSN_REGPARM void arm0B9(uint32_t opcode) { MUL_INSN(OP_UMLAL, SETCOND_MULL, 3); }
1304 1304
 
1305 1305
 // SMULL RdLo, RdHi, Rm, Rs
1306
-static INSN_REGPARM void arm0C9(u32 opcode) { MUL_INSN(OP_SMULL, SETCOND_NONE, 2); }
1306
+static INSN_REGPARM void arm0C9(uint32_t opcode) { MUL_INSN(OP_SMULL, SETCOND_NONE, 2); }
1307 1307
 // SMULLS RdLo, RdHi, Rm, Rs
1308
-static INSN_REGPARM void arm0D9(u32 opcode) { MUL_INSN(OP_SMULL, SETCOND_MULL, 2); }
1308
+static INSN_REGPARM void arm0D9(uint32_t opcode) { MUL_INSN(OP_SMULL, SETCOND_MULL, 2); }
1309 1309
 
1310 1310
 // SMLAL RdLo, RdHi, Rm, Rs
1311
-static INSN_REGPARM void arm0E9(u32 opcode) { MUL_INSN(OP_SMLAL, SETCOND_NONE, 3); }
1311
+static INSN_REGPARM void arm0E9(uint32_t opcode) { MUL_INSN(OP_SMLAL, SETCOND_NONE, 3); }
1312 1312
 // SMLALS RdLo, RdHi, Rm, Rs
1313
-static INSN_REGPARM void arm0F9(u32 opcode) { MUL_INSN(OP_SMLAL, SETCOND_MULL, 3); }
1313
+static INSN_REGPARM void arm0F9(uint32_t opcode) { MUL_INSN(OP_SMLAL, SETCOND_MULL, 3); }
1314 1314
 
1315 1315
 // Misc instructions //////////////////////////////////////////////////////
1316 1316
 
1317 1317
 // SWP Rd, Rm, [Rn]
1318
-static INSN_REGPARM void arm109(u32 opcode)
1318
+static INSN_REGPARM void arm109(uint32_t opcode)
1319 1319
 {
1320
-    u32 address = reg[(opcode >> 16) & 15].I;
1321
-    u32 temp = CPUReadMemory(address);
1320
+    uint32_t address = reg[(opcode >> 16) & 15].I;
1321
+    uint32_t temp = CPUReadMemory(address);
1322 1322
     CPUWriteMemory(address, reg[opcode&15].I);
1323 1323
     reg[(opcode >> 12) & 15].I = temp;
1324 1324
     clockTicks = 4 + dataTicksAccess32(address) + dataTicksAccess32(address)
... ...
@@ -1326,10 +1326,10 @@ static INSN_REGPARM void arm109(u32 opcode)
1326 1326
 }
1327 1327
 
1328 1328
 // SWPB Rd, Rm, [Rn]
1329
-static INSN_REGPARM void arm149(u32 opcode)
1329
+static INSN_REGPARM void arm149(uint32_t opcode)
1330 1330
 {
1331
-    u32 address = reg[(opcode >> 16) & 15].I;
1332
-    u32 temp = CPUReadByte(address);
1331
+    uint32_t address = reg[(opcode >> 16) & 15].I;
1332
+    uint32_t temp = CPUReadByte(address);
1333 1333
     CPUWriteByte(address, reg[opcode&15].B.B0);
1334 1334
     reg[(opcode>>12)&15].I = temp;
1335 1335
     clockTicks = 4 + dataTicksAccess32(address) + dataTicksAccess32(address)
... ...
@@ -1337,7 +1337,7 @@ static INSN_REGPARM void arm149(u32 opcode)
1337 1337
 }
1338 1338
 
1339 1339
 // MRS Rd, CPSR
1340
-static INSN_REGPARM void arm100(u32 opcode)
1340
+static INSN_REGPARM void arm100(uint32_t opcode)
1341 1341
 {
1342 1342
     if (LIKELY((opcode & 0x0FFF0FFF) == 0x010F0000)) {
1343 1343
         CPUUpdateCPSR();
... ...
@@ -1348,7 +1348,7 @@ static INSN_REGPARM void arm100(u32 opcode)
1348 1348
 }
1349 1349
 
1350 1350
 // MRS Rd, SPSR
1351
-static INSN_REGPARM void arm140(u32 opcode)
1351
+static INSN_REGPARM void arm140(uint32_t opcode)
1352 1352
 {
1353 1353
     if (LIKELY((opcode & 0x0FFF0FFF) == 0x014F0000)) {
1354 1354
         reg[(opcode >> 12) & 0x0F].I = reg[17].I;
... ...
@@ -1358,12 +1358,12 @@ static INSN_REGPARM void arm140(u32 opcode)
1358 1358
 }
1359 1359
 
1360 1360
 // MSR CPSR_fields, Rm
1361
-static INSN_REGPARM void arm120(u32 opcode)
1361
+static INSN_REGPARM void arm120(uint32_t opcode)
1362 1362
 {
1363 1363
     if (LIKELY((opcode & 0x0FF0FFF0) == 0x0120F000)) {
1364 1364
         CPUUpdateCPSR();
1365
-        u32 value = reg[opcode & 15].I;
1366
-        u32 newValue = reg[16].I;
1365
+        uint32_t value = reg[opcode & 15].I;
1366
+        uint32_t newValue = reg[16].I;
1367 1367
         if (armMode > 0x10) {
1368 1368
             if (opcode & 0x00010000)
1369 1369
                 newValue = (newValue & 0xFFFFFF00) | (value & 0x000000FF);
... ...
@@ -1388,10 +1388,10 @@ static INSN_REGPARM void arm120(u32 opcode)
1388 1388
 }
1389 1389
 
1390 1390
 // MSR SPSR_fields, Rm
1391
-static INSN_REGPARM void arm160(u32 opcode)
1391
+static INSN_REGPARM void arm160(uint32_t opcode)
1392 1392
 {
1393 1393
     if (LIKELY((opcode & 0x0FF0FFF0) == 0x0160F000)) {
1394
-        u32 value = reg[opcode & 15].I;
1394
+        uint32_t value = reg[opcode & 15].I;
1395 1395
         if (armMode > 0x10 && armMode < 0x1F) {
1396 1396
             if (opcode & 0x00010000)
1397 1397
                 reg[17].I = (reg[17].I & 0xFFFFFF00) | (value & 0x000000FF);
... ...
@@ -1408,16 +1408,16 @@ static INSN_REGPARM void arm160(u32 opcode)
1408 1408
 }
1409 1409
 
1410 1410
 // MSR CPSR_fields, #
1411
-static INSN_REGPARM void arm320(u32 opcode)
1411
+static INSN_REGPARM void arm320(uint32_t opcode)
1412 1412
 {
1413 1413
     if (LIKELY((opcode & 0x0FF0F000) == 0x0320F000)) {
1414 1414
         CPUUpdateCPSR();
1415
-        u32 value = opcode & 0xFF;
1415
+        uint32_t value = opcode & 0xFF;
1416 1416
         int shift = (opcode & 0xF00) >> 7;
1417 1417
         if (shift) {
1418 1418
             ROR_IMM_MSR;
1419 1419
         }
1420
-        u32 newValue = reg[16].I;
1420
+        uint32_t newValue = reg[16].I;
1421 1421
         if (armMode > 0x10) {
1422 1422
             if (opcode & 0x00010000)
1423 1423
                 newValue = (newValue & 0xFFFFFF00) | (value & 0x000000FF);
... ...
@@ -1444,11 +1444,11 @@ static INSN_REGPARM void arm320(u32 opcode)
1444 1444
 }
1445 1445
 
1446 1446
 // MSR SPSR_fields, #
1447
-static INSN_REGPARM void arm360(u32 opcode)
1447
+static INSN_REGPARM void arm360(uint32_t opcode)
1448 1448
 {
1449 1449
     if (LIKELY((opcode & 0x0FF0F000) == 0x0360F000)) {
1450 1450
         if (armMode > 0x10 && armMode < 0x1F) {
1451
-            u32 value = opcode & 0xFF;
1451
+            uint32_t value = opcode & 0xFF;
1452 1452
             int shift = (opcode & 0xF00) >> 7;
1453 1453
             if (shift) {
1454 1454
                 ROR_IMM_MSR;
... ...
@@ -1468,7 +1468,7 @@ static INSN_REGPARM void arm360(u32 opcode)
1468 1468
 }
1469 1469
 
1470 1470
 // BX Rm
1471
-static INSN_REGPARM void arm121(u32 opcode)
1471
+static INSN_REGPARM void arm121(uint32_t opcode)
1472 1472
 {
1473 1473
     if (LIKELY((opcode & 0x0FFFFFF0) == 0x012FFF10)) {
1474 1474
         int base = opcode & 0x0F;
... ...
@@ -1513,14 +1513,14 @@ static INSN_REGPARM void arm121(u32 opcode)
1513 1513
     int shift = (opcode >> 7) & 31;                     \
1514 1514
     int offset;                                         \
1515 1515
     if (shift)                                          \
1516
-        offset = (int)((s32)reg[opcode & 15].I >> shift);\
1516
+        offset = (int)((int32_t)reg[opcode & 15].I >> shift);\
1517 1517
     else if (reg[opcode & 15].I & 0x80000000)           \
1518 1518
         offset = 0xFFFFFFFF;                            \
1519 1519
     else                                                \
1520 1520
         offset = 0;
1521 1521
 #define OFFSET_ROR \
1522 1522
     int shift = (opcode >> 7) & 31;                     \
1523
-    u32 offset = reg[opcode & 15].I;                    \
1523
+    uint32_t offset = reg[opcode & 15].I;                    \
1524 1524
     if (shift) {                                        \
1525 1525
         ROR_OFFSET;                                     \
1526 1526
     } else {                                            \
... ...
@@ -1537,8 +1537,8 @@ static INSN_REGPARM void arm121(u32 opcode)
1537 1537
 #define OP_LDR    reg[dest].I = CPUReadMemory(address)
1538 1538
 #define OP_LDRH   reg[dest].I = CPUReadHalfWord(address)
1539 1539
 #define OP_LDRB   reg[dest].I = CPUReadByte(address)
1540
-#define OP_LDRSH  reg[dest].I = (u32)CPUReadHalfWordSigned(address)
1541
-#define OP_LDRSB  reg[dest].I = (s8)CPUReadByte(address)
1540
+#define OP_LDRSH  reg[dest].I = (uint32_t)CPUReadHalfWordSigned(address)
1541
+#define OP_LDRSB  reg[dest].I = (int8_t)CPUReadByte(address)
1542 1542
 
1543 1543
 #define WRITEBACK_NONE     /*nothing*/
1544 1544
 #define WRITEBACK_PRE      reg[base].I = address
... ...
@@ -1551,7 +1551,7 @@ static INSN_REGPARM void arm121(u32 opcode)
1551 1551
     int dest = (opcode >> 12) & 15;                     \
1552 1552
     int base = (opcode >> 16) & 15;                     \
1553 1553
     CALC_OFFSET;                                        \
1554
-    u32 address = CALC_ADDRESS;
1554
+    uint32_t address = CALC_ADDRESS;
1555 1555
 
1556 1556
 #define STR(CALC_OFFSET, CALC_ADDRESS, STORE_DATA, WRITEBACK1, WRITEBACK2, SIZE) \
1557 1557
     LDRSTR_INIT(CALC_OFFSET, CALC_ADDRESS);             \
... ...
@@ -1604,347 +1604,347 @@ static INSN_REGPARM void arm121(u32 opcode)
1604 1604
   LDR(CALC_OFFSET, ADDRESS_PREINC, LOAD_DATA, WRITEBACK_PRE, SIZE)
1605 1605
 
1606 1606
 // STRH Rd, [Rn], -Rm
1607
-static INSN_REGPARM void arm00B(u32 opcode) { STR_POSTDEC(OFFSET_REG, OP_STRH, 16); }
1607
+static INSN_REGPARM void arm00B(uint32_t opcode) { STR_POSTDEC(OFFSET_REG, OP_STRH, 16); }
1608 1608
 // STRH Rd, [Rn], #-offset
1609
-static INSN_REGPARM void arm04B(u32 opcode) { STR_POSTDEC(OFFSET_IMM8, OP_STRH, 16); }
1609
+static INSN_REGPARM void arm04B(uint32_t opcode) { STR_POSTDEC(OFFSET_IMM8, OP_STRH, 16); }
1610 1610
 // STRH Rd, [Rn], Rm
1611
-static INSN_REGPARM void arm08B(u32 opcode) { STR_POSTINC(OFFSET_REG, OP_STRH, 16); }
1611
+static INSN_REGPARM void arm08B(uint32_t opcode) { STR_POSTINC(OFFSET_REG, OP_STRH, 16); }
1612 1612
 // STRH Rd, [Rn], #offset
1613
-static INSN_REGPARM void arm0CB(u32 opcode) { STR_POSTINC(OFFSET_IMM8, OP_STRH, 16); }
1613
+static INSN_REGPARM void arm0CB(uint32_t opcode) { STR_POSTINC(OFFSET_IMM8, OP_STRH, 16); }
1614 1614
 // STRH Rd, [Rn, -Rm]
1615
-static INSN_REGPARM void arm10B(u32 opcode) { STR_PREDEC(OFFSET_REG, OP_STRH, 16); }
1615
+static INSN_REGPARM void arm10B(uint32_t opcode) { STR_PREDEC(OFFSET_REG, OP_STRH, 16); }
1616 1616
 // STRH Rd, [Rn, -Rm]!
1617
-static INSN_REGPARM void arm12B(u32 opcode) { STR_PREDEC_WB(OFFSET_REG, OP_STRH, 16); }
1617
+static INSN_REGPARM void arm12B(uint32_t opcode) { STR_PREDEC_WB(OFFSET_REG, OP_STRH, 16); }
1618 1618
 // STRH Rd, [Rn, -#offset]
1619
-static INSN_REGPARM void arm14B(u32 opcode) { STR_PREDEC(OFFSET_IMM8, OP_STRH, 16); }
1619
+static INSN_REGPARM void arm14B(uint32_t opcode) { STR_PREDEC(OFFSET_IMM8, OP_STRH, 16); }
1620 1620
 // STRH Rd, [Rn, -#offset]!
1621
-static INSN_REGPARM void arm16B(u32 opcode) { STR_PREDEC_WB(OFFSET_IMM8, OP_STRH, 16); }
1621
+static INSN_REGPARM void arm16B(uint32_t opcode) { STR_PREDEC_WB(OFFSET_IMM8, OP_STRH, 16); }
1622 1622
 // STRH Rd, [Rn, Rm]
1623
-static INSN_REGPARM void arm18B(u32 opcode) { STR_PREINC(OFFSET_REG, OP_STRH, 16); }
1623
+static INSN_REGPARM void arm18B(uint32_t opcode) { STR_PREINC(OFFSET_REG, OP_STRH, 16); }
1624 1624
 // STRH Rd, [Rn, Rm]!
1625
-static INSN_REGPARM void arm1AB(u32 opcode) { STR_PREINC_WB(OFFSET_REG, OP_STRH, 16); }
1625
+static INSN_REGPARM void arm1AB(uint32_t opcode) { STR_PREINC_WB(OFFSET_REG, OP_STRH, 16); }
1626 1626
 // STRH Rd, [Rn, #offset]
1627
-static INSN_REGPARM void arm1CB(u32 opcode) { STR_PREINC(OFFSET_IMM8, OP_STRH, 16); }
1627
+static INSN_REGPARM void arm1CB(uint32_t opcode) { STR_PREINC(OFFSET_IMM8, OP_STRH, 16); }
1628 1628
 // STRH Rd, [Rn, #offset]!
1629
-static INSN_REGPARM void arm1EB(u32 opcode) { STR_PREINC_WB(OFFSET_IMM8, OP_STRH, 16); }
1629
+static INSN_REGPARM void arm1EB(uint32_t opcode) { STR_PREINC_WB(OFFSET_IMM8, OP_STRH, 16); }
1630 1630
 
1631 1631
 // LDRH Rd, [Rn], -Rm
1632
-static INSN_REGPARM void arm01B(u32 opcode) { LDR_POSTDEC(OFFSET_REG, OP_LDRH, 16); }
1632
+static INSN_REGPARM void arm01B(uint32_t opcode) { LDR_POSTDEC(OFFSET_REG, OP_LDRH, 16); }
1633 1633
 // LDRH Rd, [Rn], #-offset
1634
-static INSN_REGPARM void arm05B(u32 opcode) { LDR_POSTDEC(OFFSET_IMM8, OP_LDRH, 16); }
1634
+static INSN_REGPARM void arm05B(uint32_t opcode) { LDR_POSTDEC(OFFSET_IMM8, OP_LDRH, 16); }
1635 1635
 // LDRH Rd, [Rn], Rm
1636
-static INSN_REGPARM void arm09B(u32 opcode) { LDR_POSTINC(OFFSET_REG, OP_LDRH, 16); }
1636
+static INSN_REGPARM void arm09B(uint32_t opcode) { LDR_POSTINC(OFFSET_REG, OP_LDRH, 16); }
1637 1637
 // LDRH Rd, [Rn], #offset
1638
-static INSN_REGPARM void arm0DB(u32 opcode) { LDR_POSTINC(OFFSET_IMM8, OP_LDRH, 16); }
1638
+static INSN_REGPARM void arm0DB(uint32_t opcode) { LDR_POSTINC(OFFSET_IMM8, OP_LDRH, 16); }
1639 1639
 // LDRH Rd, [Rn, -Rm]
1640
-static INSN_REGPARM void arm11B(u32 opcode) { LDR_PREDEC(OFFSET_REG, OP_LDRH, 16); }
1640
+static INSN_REGPARM void arm11B(uint32_t opcode) { LDR_PREDEC(OFFSET_REG, OP_LDRH, 16); }
1641 1641
 // LDRH Rd, [Rn, -Rm]!
1642
-static INSN_REGPARM void arm13B(u32 opcode) { LDR_PREDEC_WB(OFFSET_REG, OP_LDRH, 16); }
1642
+static INSN_REGPARM void arm13B(uint32_t opcode) { LDR_PREDEC_WB(OFFSET_REG, OP_LDRH, 16); }
1643 1643
 // LDRH Rd, [Rn, -#offset]
1644
-static INSN_REGPARM void arm15B(u32 opcode) { LDR_PREDEC(OFFSET_IMM8, OP_LDRH, 16); }
1644
+static INSN_REGPARM void arm15B(uint32_t opcode) { LDR_PREDEC(OFFSET_IMM8, OP_LDRH, 16); }
1645 1645
 // LDRH Rd, [Rn, -#offset]!
1646
-static INSN_REGPARM void arm17B(u32 opcode) { LDR_PREDEC_WB(OFFSET_IMM8, OP_LDRH, 16); }
1646
+static INSN_REGPARM void arm17B(uint32_t opcode) { LDR_PREDEC_WB(OFFSET_IMM8, OP_LDRH, 16); }
1647 1647
 // LDRH Rd, [Rn, Rm]
1648
-static INSN_REGPARM void arm19B(u32 opcode) { LDR_PREINC(OFFSET_REG, OP_LDRH, 16); }
1648
+static INSN_REGPARM void arm19B(uint32_t opcode) { LDR_PREINC(OFFSET_REG, OP_LDRH, 16); }
1649 1649
 // LDRH Rd, [Rn, Rm]!
1650
-static INSN_REGPARM void arm1BB(u32 opcode) { LDR_PREINC_WB(OFFSET_REG, OP_LDRH, 16); }
1650
+static INSN_REGPARM void arm1BB(uint32_t opcode) { LDR_PREINC_WB(OFFSET_REG, OP_LDRH, 16); }
1651 1651
 // LDRH Rd, [Rn, #offset]
1652
-static INSN_REGPARM void arm1DB(u32 opcode) { LDR_PREINC(OFFSET_IMM8, OP_LDRH, 16); }
1652
+static INSN_REGPARM void arm1DB(uint32_t opcode) { LDR_PREINC(OFFSET_IMM8, OP_LDRH, 16); }
1653 1653
 // LDRH Rd, [Rn, #offset]!
1654
-static INSN_REGPARM void arm1FB(u32 opcode) { LDR_PREINC_WB(OFFSET_IMM8, OP_LDRH, 16); }
1654
+static INSN_REGPARM void arm1FB(uint32_t opcode) { LDR_PREINC_WB(OFFSET_IMM8, OP_LDRH, 16); }
1655 1655
 
1656 1656
 // LDRSB Rd, [Rn], -Rm
1657
-static INSN_REGPARM void arm01D(u32 opcode) { LDR_POSTDEC(OFFSET_REG, OP_LDRSB, 16); }
1657
+static INSN_REGPARM void arm01D(uint32_t opcode) { LDR_POSTDEC(OFFSET_REG, OP_LDRSB, 16); }
1658 1658
 // LDRSB Rd, [Rn], #-offset
1659
-static INSN_REGPARM void arm05D(u32 opcode) { LDR_POSTDEC(OFFSET_IMM8, OP_LDRSB, 16); }
1659
+static INSN_REGPARM void arm05D(uint32_t opcode) { LDR_POSTDEC(OFFSET_IMM8, OP_LDRSB, 16); }
1660 1660
 // LDRSB Rd, [Rn], Rm
1661
-static INSN_REGPARM void arm09D(u32 opcode) { LDR_POSTINC(OFFSET_REG, OP_LDRSB, 16); }
1661
+static INSN_REGPARM void arm09D(uint32_t opcode) { LDR_POSTINC(OFFSET_REG, OP_LDRSB, 16); }
1662 1662
 // LDRSB Rd, [Rn], #offset
1663
-static INSN_REGPARM void arm0DD(u32 opcode) { LDR_POSTINC(OFFSET_IMM8, OP_LDRSB, 16); }
1663
+static INSN_REGPARM void arm0DD(uint32_t opcode) { LDR_POSTINC(OFFSET_IMM8, OP_LDRSB, 16); }
1664 1664
 // LDRSB Rd, [Rn, -Rm]
1665
-static INSN_REGPARM void arm11D(u32 opcode) { LDR_PREDEC(OFFSET_REG, OP_LDRSB, 16); }
1665
+static INSN_REGPARM void arm11D(uint32_t opcode) { LDR_PREDEC(OFFSET_REG, OP_LDRSB, 16); }
1666 1666
 // LDRSB Rd, [Rn, -Rm]!
1667
-static INSN_REGPARM void arm13D(u32 opcode) { LDR_PREDEC_WB(OFFSET_REG, OP_LDRSB, 16); }
1667
+static INSN_REGPARM void arm13D(uint32_t opcode) { LDR_PREDEC_WB(OFFSET_REG, OP_LDRSB, 16); }
1668 1668
 // LDRSB Rd, [Rn, -#offset]
1669
-static INSN_REGPARM void arm15D(u32 opcode) { LDR_PREDEC(OFFSET_IMM8, OP_LDRSB, 16); }
1669
+static INSN_REGPARM void arm15D(uint32_t opcode) { LDR_PREDEC(OFFSET_IMM8, OP_LDRSB, 16); }
1670 1670
 // LDRSB Rd, [Rn, -#offset]!
1671
-static INSN_REGPARM void arm17D(u32 opcode) { LDR_PREDEC_WB(OFFSET_IMM8, OP_LDRSB, 16); }
1671
+static INSN_REGPARM void arm17D(uint32_t opcode) { LDR_PREDEC_WB(OFFSET_IMM8, OP_LDRSB, 16); }
1672 1672
 // LDRSB Rd, [Rn, Rm]
1673
-static INSN_REGPARM void arm19D(u32 opcode) { LDR_PREINC(OFFSET_REG, OP_LDRSB, 16); }
1673
+static INSN_REGPARM void arm19D(uint32_t opcode) { LDR_PREINC(OFFSET_REG, OP_LDRSB, 16); }
1674 1674
 // LDRSB Rd, [Rn, Rm]!
1675
-static INSN_REGPARM void arm1BD(u32 opcode) { LDR_PREINC_WB(OFFSET_REG, OP_LDRSB, 16); }
1675
+static INSN_REGPARM void arm1BD(uint32_t opcode) { LDR_PREINC_WB(OFFSET_REG, OP_LDRSB, 16); }
1676 1676
 // LDRSB Rd, [Rn, #offset]
1677
-static INSN_REGPARM void arm1DD(u32 opcode) { LDR_PREINC(OFFSET_IMM8, OP_LDRSB, 16); }
1677
+static INSN_REGPARM void arm1DD(uint32_t opcode) { LDR_PREINC(OFFSET_IMM8, OP_LDRSB, 16); }
1678 1678
 // LDRSB Rd, [Rn, #offset]!
1679
-static INSN_REGPARM void arm1FD(u32 opcode) { LDR_PREINC_WB(OFFSET_IMM8, OP_LDRSB, 16); }
1679
+static INSN_REGPARM void arm1FD(uint32_t opcode) { LDR_PREINC_WB(OFFSET_IMM8, OP_LDRSB, 16); }
1680 1680
 
1681 1681
 // LDRSH Rd, [Rn], -Rm
1682
-static INSN_REGPARM void arm01F(u32 opcode) { LDR_POSTDEC(OFFSET_REG, OP_LDRSH, 16); }
1682
+static INSN_REGPARM void arm01F(uint32_t opcode) { LDR_POSTDEC(OFFSET_REG, OP_LDRSH, 16); }
1683 1683
 // LDRSH Rd, [Rn], #-offset
1684
-static INSN_REGPARM void arm05F(u32 opcode) { LDR_POSTDEC(OFFSET_IMM8, OP_LDRSH, 16); }
1684
+static INSN_REGPARM void arm05F(uint32_t opcode) { LDR_POSTDEC(OFFSET_IMM8, OP_LDRSH, 16); }
1685 1685
 // LDRSH Rd, [Rn], Rm
1686
-static INSN_REGPARM void arm09F(u32 opcode) { LDR_POSTINC(OFFSET_REG, OP_LDRSH, 16); }
1686
+static INSN_REGPARM void arm09F(uint32_t opcode) { LDR_POSTINC(OFFSET_REG, OP_LDRSH, 16); }
1687 1687
 // LDRSH Rd, [Rn], #offset
1688
-static INSN_REGPARM void arm0DF(u32 opcode) { LDR_POSTINC(OFFSET_IMM8, OP_LDRSH, 16); }
1688
+static INSN_REGPARM void arm0DF(uint32_t opcode) { LDR_POSTINC(OFFSET_IMM8, OP_LDRSH, 16); }
1689 1689
 // LDRSH Rd, [Rn, -Rm]
1690
-static INSN_REGPARM void arm11F(u32 opcode) { LDR_PREDEC(OFFSET_REG, OP_LDRSH, 16); }
1690
+static INSN_REGPARM void arm11F(uint32_t opcode) { LDR_PREDEC(OFFSET_REG, OP_LDRSH, 16); }
1691 1691
 // LDRSH Rd, [Rn, -Rm]!
1692
-static INSN_REGPARM void arm13F(u32 opcode) { LDR_PREDEC_WB(OFFSET_REG, OP_LDRSH, 16); }
1692
+static INSN_REGPARM void arm13F(uint32_t opcode) { LDR_PREDEC_WB(OFFSET_REG, OP_LDRSH, 16); }
1693 1693
 // LDRSH Rd, [Rn, -#offset]
1694
-static INSN_REGPARM void arm15F(u32 opcode) { LDR_PREDEC(OFFSET_IMM8, OP_LDRSH, 16); }
1694
+static INSN_REGPARM void arm15F(uint32_t opcode) { LDR_PREDEC(OFFSET_IMM8, OP_LDRSH, 16); }
1695 1695
 // LDRSH Rd, [Rn, -#offset]!
1696
-static INSN_REGPARM void arm17F(u32 opcode) { LDR_PREDEC_WB(OFFSET_IMM8, OP_LDRSH, 16); }
1696
+static INSN_REGPARM void arm17F(uint32_t opcode) { LDR_PREDEC_WB(OFFSET_IMM8, OP_LDRSH, 16); }
1697 1697
 // LDRSH Rd, [Rn, Rm]
1698
-static INSN_REGPARM void arm19F(u32 opcode) { LDR_PREINC(OFFSET_REG, OP_LDRSH, 16); }
1698
+static INSN_REGPARM void arm19F(uint32_t opcode) { LDR_PREINC(OFFSET_REG, OP_LDRSH, 16); }
1699 1699
 // LDRSH Rd, [Rn, Rm]!
1700
-static INSN_REGPARM void arm1BF(u32 opcode) { LDR_PREINC_WB(OFFSET_REG, OP_LDRSH, 16); }
1700
+static INSN_REGPARM void arm1BF(uint32_t opcode) { LDR_PREINC_WB(OFFSET_REG, OP_LDRSH, 16); }
1701 1701
 // LDRSH Rd, [Rn, #offset]
1702
-static INSN_REGPARM void arm1DF(u32 opcode) { LDR_PREINC(OFFSET_IMM8, OP_LDRSH, 16); }
1702
+static INSN_REGPARM void arm1DF(uint32_t opcode) { LDR_PREINC(OFFSET_IMM8, OP_LDRSH, 16); }
1703 1703
 // LDRSH Rd, [Rn, #offset]!
1704
-static INSN_REGPARM void arm1FF(u32 opcode) { LDR_PREINC_WB(OFFSET_IMM8, OP_LDRSH, 16); }
1704
+static INSN_REGPARM void arm1FF(uint32_t opcode) { LDR_PREINC_WB(OFFSET_IMM8, OP_LDRSH, 16); }
1705 1705
 
1706 1706
 // STR[T] Rd, [Rn], -#
1707 1707
 // Note: STR and STRT do the same thing on the GBA (likewise for LDR/LDRT etc)
1708
-static INSN_REGPARM void arm400(u32 opcode) { STR_POSTDEC(OFFSET_IMM, OP_STR, 32); }
1708
+static INSN_REGPARM void arm400(uint32_t opcode) { STR_POSTDEC(OFFSET_IMM, OP_STR, 32); }
1709 1709
 // LDR[T] Rd, [Rn], -#
1710
-static INSN_REGPARM void arm410(u32 opcode) { LDR_POSTDEC(OFFSET_IMM, OP_LDR, 32); }
1710
+static INSN_REGPARM void arm410(uint32_t opcode) { LDR_POSTDEC(OFFSET_IMM, OP_LDR, 32); }
1711 1711
 // STRB[T] Rd, [Rn], -#
1712
-static INSN_REGPARM void arm440(u32 opcode) { STR_POSTDEC(OFFSET_IMM, OP_STRB, 16); }
1712
+static INSN_REGPARM void arm440(uint32_t opcode) { STR_POSTDEC(OFFSET_IMM, OP_STRB, 16); }
1713 1713
 // LDRB[T] Rd, [Rn], -#
1714
-static INSN_REGPARM void arm450(u32 opcode) { LDR_POSTDEC(OFFSET_IMM, OP_LDRB, 16); }
1714
+static INSN_REGPARM void arm450(uint32_t opcode) { LDR_POSTDEC(OFFSET_IMM, OP_LDRB, 16); }
1715 1715
 // STR[T] Rd, [Rn], #
1716
-static INSN_REGPARM void arm480(u32 opcode) { STR_POSTINC(OFFSET_IMM, OP_STR, 32); }
1716
+static INSN_REGPARM void arm480(uint32_t opcode) { STR_POSTINC(OFFSET_IMM, OP_STR, 32); }
1717 1717
 // LDR Rd, [Rn], #
1718
-static INSN_REGPARM void arm490(u32 opcode) { LDR_POSTINC(OFFSET_IMM, OP_LDR, 32); }
1718
+static INSN_REGPARM void arm490(uint32_t opcode) { LDR_POSTINC(OFFSET_IMM, OP_LDR, 32); }
1719 1719
 // STRB[T] Rd, [Rn], #
1720
-static INSN_REGPARM void arm4C0(u32 opcode) { STR_POSTINC(OFFSET_IMM, OP_STRB, 16); }
1720
+static INSN_REGPARM void arm4C0(uint32_t opcode) { STR_POSTINC(OFFSET_IMM, OP_STRB, 16); }
1721 1721
 // LDRB[T] Rd, [Rn], #
1722
-static INSN_REGPARM void arm4D0(u32 opcode) { LDR_POSTINC(OFFSET_IMM, OP_LDRB, 16); }
1722
+static INSN_REGPARM void arm4D0(uint32_t opcode) { LDR_POSTINC(OFFSET_IMM, OP_LDRB, 16); }
1723 1723
 // STR Rd, [Rn, -#]
1724
-static INSN_REGPARM void arm500(u32 opcode) { STR_PREDEC(OFFSET_IMM, OP_STR, 32); }
1724
+static INSN_REGPARM void arm500(uint32_t opcode) { STR_PREDEC(OFFSET_IMM, OP_STR, 32); }
1725 1725
 // LDR Rd, [Rn, -#]
1726
-static INSN_REGPARM void arm510(u32 opcode) { LDR_PREDEC(OFFSET_IMM, OP_LDR, 32); }
1726
+static INSN_REGPARM void arm510(uint32_t opcode) { LDR_PREDEC(OFFSET_IMM, OP_LDR, 32); }
1727 1727
 // STR Rd, [Rn, -#]!
1728
-static INSN_REGPARM void arm520(u32 opcode) { STR_PREDEC_WB(OFFSET_IMM, OP_STR, 32); }
1728
+static INSN_REGPARM void arm520(uint32_t opcode) { STR_PREDEC_WB(OFFSET_IMM, OP_STR, 32); }
1729 1729
 // LDR Rd, [Rn, -#]!
1730
-static INSN_REGPARM void arm530(u32 opcode) { LDR_PREDEC_WB(OFFSET_IMM, OP_LDR, 32); }
1730
+static INSN_REGPARM void arm530(uint32_t opcode) { LDR_PREDEC_WB(OFFSET_IMM, OP_LDR, 32); }
1731 1731
 // STRB Rd, [Rn, -#]
1732
-static INSN_REGPARM void arm540(u32 opcode) { STR_PREDEC(OFFSET_IMM, OP_STRB, 16); }
1732
+static INSN_REGPARM void arm540(uint32_t opcode) { STR_PREDEC(OFFSET_IMM, OP_STRB, 16); }
1733 1733
 // LDRB Rd, [Rn, -#]
1734
-static INSN_REGPARM void arm550(u32 opcode) { LDR_PREDEC(OFFSET_IMM, OP_LDRB, 16); }
1734
+static INSN_REGPARM void arm550(uint32_t opcode) { LDR_PREDEC(OFFSET_IMM, OP_LDRB, 16); }
1735 1735
 // STRB Rd, [Rn, -#]!
1736
-static INSN_REGPARM void arm560(u32 opcode) { STR_PREDEC_WB(OFFSET_IMM, OP_STRB, 16); }
1736
+static INSN_REGPARM void arm560(uint32_t opcode) { STR_PREDEC_WB(OFFSET_IMM, OP_STRB, 16); }
1737 1737
 // LDRB Rd, [Rn, -#]!
1738
-static INSN_REGPARM void arm570(u32 opcode) { LDR_PREDEC_WB(OFFSET_IMM, OP_LDRB, 16); }
1738
+static INSN_REGPARM void arm570(uint32_t opcode) { LDR_PREDEC_WB(OFFSET_IMM, OP_LDRB, 16); }
1739 1739
 // STR Rd, [Rn, #]
1740
-static INSN_REGPARM void arm580(u32 opcode) { STR_PREINC(OFFSET_IMM, OP_STR, 32); }
1740
+static INSN_REGPARM void arm580(uint32_t opcode) { STR_PREINC(OFFSET_IMM, OP_STR, 32); }
1741 1741
 // LDR Rd, [Rn, #]
1742
-static INSN_REGPARM void arm590(u32 opcode) { LDR_PREINC(OFFSET_IMM, OP_LDR, 32); }
1742
+static INSN_REGPARM void arm590(uint32_t opcode) { LDR_PREINC(OFFSET_IMM, OP_LDR, 32); }
1743 1743
 // STR Rd, [Rn, #]!
1744
-static INSN_REGPARM void arm5A0(u32 opcode) { STR_PREINC_WB(OFFSET_IMM, OP_STR, 32); }
1744
+static INSN_REGPARM void arm5A0(uint32_t opcode) { STR_PREINC_WB(OFFSET_IMM, OP_STR, 32); }
1745 1745
 // LDR Rd, [Rn, #]!
1746
-static INSN_REGPARM void arm5B0(u32 opcode) { LDR_PREINC_WB(OFFSET_IMM, OP_LDR, 32); }
1746
+static INSN_REGPARM void arm5B0(uint32_t opcode) { LDR_PREINC_WB(OFFSET_IMM, OP_LDR, 32); }
1747 1747
 // STRB Rd, [Rn, #]
1748
-static INSN_REGPARM void arm5C0(u32 opcode) { STR_PREINC(OFFSET_IMM, OP_STRB, 16); }
1748
+static INSN_REGPARM void arm5C0(uint32_t opcode) { STR_PREINC(OFFSET_IMM, OP_STRB, 16); }
1749 1749
 // LDRB Rd, [Rn, #]
1750
-static INSN_REGPARM void arm5D0(u32 opcode) { LDR_PREINC(OFFSET_IMM, OP_LDRB, 16); }
1750
+static INSN_REGPARM void arm5D0(uint32_t opcode) { LDR_PREINC(OFFSET_IMM, OP_LDRB, 16); }
1751 1751
 // STRB Rd, [Rn, #]!
1752
-static INSN_REGPARM void arm5E0(u32 opcode) { STR_PREINC_WB(OFFSET_IMM, OP_STRB, 16); }
1752
+static INSN_REGPARM void arm5E0(uint32_t opcode) { STR_PREINC_WB(OFFSET_IMM, OP_STRB, 16); }
1753 1753
 // LDRB Rd, [Rn, #]!
1754
-static INSN_REGPARM void arm5F0(u32 opcode) { LDR_PREINC_WB(OFFSET_IMM, OP_LDRB, 16); }
1754
+static INSN_REGPARM void arm5F0(uint32_t opcode) { LDR_PREINC_WB(OFFSET_IMM, OP_LDRB, 16); }
1755 1755
 
1756 1756
 // STR[T] Rd, [Rn], -Rm, LSL #
1757
-static INSN_REGPARM void arm600(u32 opcode) { STR_POSTDEC(OFFSET_LSL, OP_STR, 32); }
1757
+static INSN_REGPARM void arm600(uint32_t opcode) { STR_POSTDEC(OFFSET_LSL, OP_STR, 32); }
1758 1758
 // STR[T] Rd, [Rn], -Rm, LSR #
1759
-static INSN_REGPARM void arm602(u32 opcode) { STR_POSTDEC(OFFSET_LSR, OP_STR, 32); }
1759
+static INSN_REGPARM void arm602(uint32_t opcode) { STR_POSTDEC(OFFSET_LSR, OP_STR, 32); }
1760 1760
 // STR[T] Rd, [Rn], -Rm, ASR #
1761
-static INSN_REGPARM void arm604(u32 opcode) { STR_POSTDEC(OFFSET_ASR, OP_STR, 32); }
1761
+static INSN_REGPARM void arm604(uint32_t opcode) { STR_POSTDEC(OFFSET_ASR, OP_STR, 32); }
1762 1762
 // STR[T] Rd, [Rn], -Rm, ROR #
1763
-static INSN_REGPARM void arm606(u32 opcode) { STR_POSTDEC(OFFSET_ROR, OP_STR, 32); }
1763
+static INSN_REGPARM void arm606(uint32_t opcode) { STR_POSTDEC(OFFSET_ROR, OP_STR, 32); }
1764 1764
 // LDR[T] Rd, [Rn], -Rm, LSL #
1765
-static INSN_REGPARM void arm610(u32 opcode) { LDR_POSTDEC(OFFSET_LSL, OP_LDR, 32); }
1765
+static INSN_REGPARM void arm610(uint32_t opcode) { LDR_POSTDEC(OFFSET_LSL, OP_LDR, 32); }
1766 1766
 // LDR[T] Rd, [Rn], -Rm, LSR #
1767
-static INSN_REGPARM void arm612(u32 opcode) { LDR_POSTDEC(OFFSET_LSR, OP_LDR, 32); }
1767
+static INSN_REGPARM void arm612(uint32_t opcode) { LDR_POSTDEC(OFFSET_LSR, OP_LDR, 32); }
1768 1768
 // LDR[T] Rd, [Rn], -Rm, ASR #
1769
-static INSN_REGPARM void arm614(u32 opcode) { LDR_POSTDEC(OFFSET_ASR, OP_LDR, 32); }
1769
+static INSN_REGPARM void arm614(uint32_t opcode) { LDR_POSTDEC(OFFSET_ASR, OP_LDR, 32); }
1770 1770
 // LDR[T] Rd, [Rn], -Rm, ROR #
1771
-static INSN_REGPARM void arm616(u32 opcode) { LDR_POSTDEC(OFFSET_ROR, OP_LDR, 32); }
1771
+static INSN_REGPARM void arm616(uint32_t opcode) { LDR_POSTDEC(OFFSET_ROR, OP_LDR, 32); }
1772 1772
 // STRB[T] Rd, [Rn], -Rm, LSL #
1773
-static INSN_REGPARM void arm640(u32 opcode) { STR_POSTDEC(OFFSET_LSL, OP_STRB, 16); }
1773
+static INSN_REGPARM void arm640(uint32_t opcode) { STR_POSTDEC(OFFSET_LSL, OP_STRB, 16); }
1774 1774
 // STRB[T] Rd, [Rn], -Rm, LSR #
1775
-static INSN_REGPARM void arm642(u32 opcode) { STR_POSTDEC(OFFSET_LSR, OP_STRB, 16); }
1775
+static INSN_REGPARM void arm642(uint32_t opcode) { STR_POSTDEC(OFFSET_LSR, OP_STRB, 16); }
1776 1776
 // STRB[T] Rd, [Rn], -Rm, ASR #
1777
-static INSN_REGPARM void arm644(u32 opcode) { STR_POSTDEC(OFFSET_ASR, OP_STRB, 16); }
1777
+static INSN_REGPARM void arm644(uint32_t opcode) { STR_POSTDEC(OFFSET_ASR, OP_STRB, 16); }
1778 1778
 // STRB[T] Rd, [Rn], -Rm, ROR #
1779
-static INSN_REGPARM void arm646(u32 opcode) { STR_POSTDEC(OFFSET_ROR, OP_STRB, 16); }
1779
+static INSN_REGPARM void arm646(uint32_t opcode) { STR_POSTDEC(OFFSET_ROR, OP_STRB, 16); }
1780 1780
 // LDRB[T] Rd, [Rn], -Rm, LSL #
1781
-static INSN_REGPARM void arm650(u32 opcode) { LDR_POSTDEC(OFFSET_LSL, OP_LDRB, 16); }
1781
+static INSN_REGPARM void arm650(uint32_t opcode) { LDR_POSTDEC(OFFSET_LSL, OP_LDRB, 16); }
1782 1782
 // LDRB[T] Rd, [Rn], -Rm, LSR #
1783
-static INSN_REGPARM void arm652(u32 opcode) { LDR_POSTDEC(OFFSET_LSR, OP_LDRB, 16); }
1783
+static INSN_REGPARM void arm652(uint32_t opcode) { LDR_POSTDEC(OFFSET_LSR, OP_LDRB, 16); }
1784 1784
 // LDRB[T] Rd, [Rn], -Rm, ASR #
1785
-static INSN_REGPARM void arm654(u32 opcode) { LDR_POSTDEC(OFFSET_ASR, OP_LDRB, 16); }
1785
+static INSN_REGPARM void arm654(uint32_t opcode) { LDR_POSTDEC(OFFSET_ASR, OP_LDRB, 16); }
1786 1786
 // LDRB Rd, [Rn], -Rm, ROR #
1787
-static INSN_REGPARM void arm656(u32 opcode) { LDR_POSTDEC(OFFSET_ROR, OP_LDRB, 16); }
1787
+static INSN_REGPARM void arm656(uint32_t opcode) { LDR_POSTDEC(OFFSET_ROR, OP_LDRB, 16); }
1788 1788
 // STR[T] Rd, [Rn], Rm, LSL #
1789
-static INSN_REGPARM void arm680(u32 opcode) { STR_POSTINC(OFFSET_LSL, OP_STR, 32); }
1789
+static INSN_REGPARM void arm680(uint32_t opcode) { STR_POSTINC(OFFSET_LSL, OP_STR, 32); }
1790 1790
 // STR[T] Rd, [Rn], Rm, LSR #
1791
-static INSN_REGPARM void arm682(u32 opcode) { STR_POSTINC(OFFSET_LSR, OP_STR, 32); }
1791
+static INSN_REGPARM void arm682(uint32_t opcode) { STR_POSTINC(OFFSET_LSR, OP_STR, 32); }
1792 1792
 // STR[T] Rd, [Rn], Rm, ASR #
1793
-static INSN_REGPARM void arm684(u32 opcode) { STR_POSTINC(OFFSET_ASR, OP_STR, 32); }
1793
+static INSN_REGPARM void arm684(uint32_t opcode) { STR_POSTINC(OFFSET_ASR, OP_STR, 32); }
1794 1794
 // STR[T] Rd, [Rn], Rm, ROR #
1795
-static INSN_REGPARM void arm686(u32 opcode) { STR_POSTINC(OFFSET_ROR, OP_STR, 32); }
1795
+static INSN_REGPARM void arm686(uint32_t opcode) { STR_POSTINC(OFFSET_ROR, OP_STR, 32); }
1796 1796
 // LDR[T] Rd, [Rn], Rm, LSL #
1797
-static INSN_REGPARM void arm690(u32 opcode) { LDR_POSTINC(OFFSET_LSL, OP_LDR, 32); }
1797
+static INSN_REGPARM void arm690(uint32_t opcode) { LDR_POSTINC(OFFSET_LSL, OP_LDR, 32); }
1798 1798
 // LDR[T] Rd, [Rn], Rm, LSR #
1799
-static INSN_REGPARM void arm692(u32 opcode) { LDR_POSTINC(OFFSET_LSR, OP_LDR, 32); }
1799
+static INSN_REGPARM void arm692(uint32_t opcode) { LDR_POSTINC(OFFSET_LSR, OP_LDR, 32); }
1800 1800
 // LDR[T] Rd, [Rn], Rm, ASR #
1801
-static INSN_REGPARM void arm694(u32 opcode) { LDR_POSTINC(OFFSET_ASR, OP_LDR, 32); }
1801
+static INSN_REGPARM void arm694(uint32_t opcode) { LDR_POSTINC(OFFSET_ASR, OP_LDR, 32); }
1802 1802
 // LDR[T] Rd, [Rn], Rm, ROR #
1803
-static INSN_REGPARM void arm696(u32 opcode) { LDR_POSTINC(OFFSET_ROR, OP_LDR, 32); }
1803
+static INSN_REGPARM void arm696(uint32_t opcode) { LDR_POSTINC(OFFSET_ROR, OP_LDR, 32); }
1804 1804
 // STRB[T] Rd, [Rn], Rm, LSL #
1805
-static INSN_REGPARM void arm6C0(u32 opcode) { STR_POSTINC(OFFSET_LSL, OP_STRB, 16); }
1805
+static INSN_REGPARM void arm6C0(uint32_t opcode) { STR_POSTINC(OFFSET_LSL, OP_STRB, 16); }
1806 1806
 // STRB[T] Rd, [Rn], Rm, LSR #
1807
-static INSN_REGPARM void arm6C2(u32 opcode) { STR_POSTINC(OFFSET_LSR, OP_STRB, 16); }
1807
+static INSN_REGPARM void arm6C2(uint32_t opcode) { STR_POSTINC(OFFSET_LSR, OP_STRB, 16); }
1808 1808
 // STRB[T] Rd, [Rn], Rm, ASR #
1809
-static INSN_REGPARM void arm6C4(u32 opcode) { STR_POSTINC(OFFSET_ASR, OP_STRB, 16); }
1809
+static INSN_REGPARM void arm6C4(uint32_t opcode) { STR_POSTINC(OFFSET_ASR, OP_STRB, 16); }
1810 1810
 // STRB[T] Rd, [Rn], Rm, ROR #
1811
-static INSN_REGPARM void arm6C6(u32 opcode) { STR_POSTINC(OFFSET_ROR, OP_STRB, 16); }
1811
+static INSN_REGPARM void arm6C6(uint32_t opcode) { STR_POSTINC(OFFSET_ROR, OP_STRB, 16); }
1812 1812
 // LDRB[T] Rd, [Rn], Rm, LSL #
1813
-static INSN_REGPARM void arm6D0(u32 opcode) { LDR_POSTINC(OFFSET_LSL, OP_LDRB, 16); }
1813
+static INSN_REGPARM void arm6D0(uint32_t opcode) { LDR_POSTINC(OFFSET_LSL, OP_LDRB, 16); }
1814 1814
 // LDRB[T] Rd, [Rn], Rm, LSR #
1815
-static INSN_REGPARM void arm6D2(u32 opcode) { LDR_POSTINC(OFFSET_LSR, OP_LDRB, 16); }
1815
+static INSN_REGPARM void arm6D2(uint32_t opcode) { LDR_POSTINC(OFFSET_LSR, OP_LDRB, 16); }
1816 1816
 // LDRB[T] Rd, [Rn], Rm, ASR #
1817
-static INSN_REGPARM void arm6D4(u32 opcode) { LDR_POSTINC(OFFSET_ASR, OP_LDRB, 16); }
1817
+static INSN_REGPARM void arm6D4(uint32_t opcode) { LDR_POSTINC(OFFSET_ASR, OP_LDRB, 16); }
1818 1818
 // LDRB[T] Rd, [Rn], Rm, ROR #
1819
-static INSN_REGPARM void arm6D6(u32 opcode) { LDR_POSTINC(OFFSET_ROR, OP_LDRB, 16); }
1819
+static INSN_REGPARM void arm6D6(uint32_t opcode) { LDR_POSTINC(OFFSET_ROR, OP_LDRB, 16); }
1820 1820
 // STR Rd, [Rn, -Rm, LSL #]
1821
-static INSN_REGPARM void arm700(u32 opcode) { STR_PREDEC(OFFSET_LSL, OP_STR, 32); }
1821
+static INSN_REGPARM void arm700(uint32_t opcode) { STR_PREDEC(OFFSET_LSL, OP_STR, 32); }
1822 1822
 // STR Rd, [Rn, -Rm, LSR #]
1823
-static INSN_REGPARM void arm702(u32 opcode) { STR_PREDEC(OFFSET_LSR, OP_STR, 32); }
1823
+static INSN_REGPARM void arm702(uint32_t opcode) { STR_PREDEC(OFFSET_LSR, OP_STR, 32); }
1824 1824
 // STR Rd, [Rn, -Rm, ASR #]
1825
-static INSN_REGPARM void arm704(u32 opcode) { STR_PREDEC(OFFSET_ASR, OP_STR, 32); }
1825
+static INSN_REGPARM void arm704(uint32_t opcode) { STR_PREDEC(OFFSET_ASR, OP_STR, 32); }
1826 1826
 // STR Rd, [Rn, -Rm, ROR #]
1827
-static INSN_REGPARM void arm706(u32 opcode) { STR_PREDEC(OFFSET_ROR, OP_STR, 32); }
1827
+static INSN_REGPARM void arm706(uint32_t opcode) { STR_PREDEC(OFFSET_ROR, OP_STR, 32); }
1828 1828
 // LDR Rd, [Rn, -Rm, LSL #]
1829
-static INSN_REGPARM void arm710(u32 opcode) { LDR_PREDEC(OFFSET_LSL, OP_LDR, 32); }
1829
+static INSN_REGPARM void arm710(uint32_t opcode) { LDR_PREDEC(OFFSET_LSL, OP_LDR, 32); }
1830 1830
 // LDR Rd, [Rn, -Rm, LSR #]
1831
-static INSN_REGPARM void arm712(u32 opcode) { LDR_PREDEC(OFFSET_LSR, OP_LDR, 32); }
1831
+static INSN_REGPARM void arm712(uint32_t opcode) { LDR_PREDEC(OFFSET_LSR, OP_LDR, 32); }
1832 1832
 // LDR Rd, [Rn, -Rm, ASR #]
1833
-static INSN_REGPARM void arm714(u32 opcode) { LDR_PREDEC(OFFSET_ASR, OP_LDR, 32); }
1833
+static INSN_REGPARM void arm714(uint32_t opcode) { LDR_PREDEC(OFFSET_ASR, OP_LDR, 32); }
1834 1834
 // LDR Rd, [Rn, -Rm, ROR #]
1835
-static INSN_REGPARM void arm716(u32 opcode) { LDR_PREDEC(OFFSET_ROR, OP_LDR, 32); }
1835
+static INSN_REGPARM void arm716(uint32_t opcode) { LDR_PREDEC(OFFSET_ROR, OP_LDR, 32); }
1836 1836
 // STR Rd, [Rn, -Rm, LSL #]!
1837
-static INSN_REGPARM void arm720(u32 opcode) { STR_PREDEC_WB(OFFSET_LSL, OP_STR, 32); }
1837
+static INSN_REGPARM void arm720(uint32_t opcode) { STR_PREDEC_WB(OFFSET_LSL, OP_STR, 32); }
1838 1838
 // STR Rd, [Rn, -Rm, LSR #]!
1839
-static INSN_REGPARM void arm722(u32 opcode) { STR_PREDEC_WB(OFFSET_LSR, OP_STR, 32); }
1839
+static INSN_REGPARM void arm722(uint32_t opcode) { STR_PREDEC_WB(OFFSET_LSR, OP_STR, 32); }
1840 1840
 // STR Rd, [Rn, -Rm, ASR #]!
1841
-static INSN_REGPARM void arm724(u32 opcode) { STR_PREDEC_WB(OFFSET_ASR, OP_STR, 32); }
1841
+static INSN_REGPARM void arm724(uint32_t opcode) { STR_PREDEC_WB(OFFSET_ASR, OP_STR, 32); }
1842 1842
 // STR Rd, [Rn, -Rm, ROR #]!
1843
-static INSN_REGPARM void arm726(u32 opcode) { STR_PREDEC_WB(OFFSET_ROR, OP_STR, 32); }
1843
+static INSN_REGPARM void arm726(uint32_t opcode) { STR_PREDEC_WB(OFFSET_ROR, OP_STR, 32); }
1844 1844
 // LDR Rd, [Rn, -Rm, LSL #]!
1845
-static INSN_REGPARM void arm730(u32 opcode) { LDR_PREDEC_WB(OFFSET_LSL, OP_LDR, 32); }
1845
+static INSN_REGPARM void arm730(uint32_t opcode) { LDR_PREDEC_WB(OFFSET_LSL, OP_LDR, 32); }
1846 1846
 // LDR Rd, [Rn, -Rm, LSR #]!
1847
-static INSN_REGPARM void arm732(u32 opcode) { LDR_PREDEC_WB(OFFSET_LSR, OP_LDR, 32); }
1847
+static INSN_REGPARM void arm732(uint32_t opcode) { LDR_PREDEC_WB(OFFSET_LSR, OP_LDR, 32); }
1848 1848
 // LDR Rd, [Rn, -Rm, ASR #]!
1849
-static INSN_REGPARM void arm734(u32 opcode) { LDR_PREDEC_WB(OFFSET_ASR, OP_LDR, 32); }
1849
+static INSN_REGPARM void arm734(uint32_t opcode) { LDR_PREDEC_WB(OFFSET_ASR, OP_LDR, 32); }
1850 1850
 // LDR Rd, [Rn, -Rm, ROR #]!
1851
-static INSN_REGPARM void arm736(u32 opcode) { LDR_PREDEC_WB(OFFSET_ROR, OP_LDR, 32); }
1851
+static INSN_REGPARM void arm736(uint32_t opcode) { LDR_PREDEC_WB(OFFSET_ROR, OP_LDR, 32); }
1852 1852
 // STRB Rd, [Rn, -Rm, LSL #]
1853
-static INSN_REGPARM void arm740(u32 opcode) { STR_PREDEC(OFFSET_LSL, OP_STRB, 16); }
1853
+static INSN_REGPARM void arm740(uint32_t opcode) { STR_PREDEC(OFFSET_LSL, OP_STRB, 16); }
1854 1854
 // STRB Rd, [Rn, -Rm, LSR #]
1855
-static INSN_REGPARM void arm742(u32 opcode) { STR_PREDEC(OFFSET_LSR, OP_STRB, 16); }
1855
+static INSN_REGPARM void arm742(uint32_t opcode) { STR_PREDEC(OFFSET_LSR, OP_STRB, 16); }
1856 1856
 // STRB Rd, [Rn, -Rm, ASR #]
1857
-static INSN_REGPARM void arm744(u32 opcode) { STR_PREDEC(OFFSET_ASR, OP_STRB, 16); }
1857
+static INSN_REGPARM void arm744(uint32_t opcode) { STR_PREDEC(OFFSET_ASR, OP_STRB, 16); }
1858 1858
 // STRB Rd, [Rn, -Rm, ROR #]
1859
-static INSN_REGPARM void arm746(u32 opcode) { STR_PREDEC(OFFSET_ROR, OP_STRB, 16); }
1859
+static INSN_REGPARM void arm746(uint32_t opcode) { STR_PREDEC(OFFSET_ROR, OP_STRB, 16); }
1860 1860
 // LDRB Rd, [Rn, -Rm, LSL #]
1861
-static INSN_REGPARM void arm750(u32 opcode) { LDR_PREDEC(OFFSET_LSL, OP_LDRB, 16); }
1861
+static INSN_REGPARM void arm750(uint32_t opcode) { LDR_PREDEC(OFFSET_LSL, OP_LDRB, 16); }
1862 1862
 // LDRB Rd, [Rn, -Rm, LSR #]
1863
-static INSN_REGPARM void arm752(u32 opcode) { LDR_PREDEC(OFFSET_LSR, OP_LDRB, 16); }
1863
+static INSN_REGPARM void arm752(uint32_t opcode) { LDR_PREDEC(OFFSET_LSR, OP_LDRB, 16); }
1864 1864
 // LDRB Rd, [Rn, -Rm, ASR #]
1865
-static INSN_REGPARM void arm754(u32 opcode) { LDR_PREDEC(OFFSET_ASR, OP_LDRB, 16); }
1865
+static INSN_REGPARM void arm754(uint32_t opcode) { LDR_PREDEC(OFFSET_ASR, OP_LDRB, 16); }
1866 1866
 // LDRB Rd, [Rn, -Rm, ROR #]
1867
-static INSN_REGPARM void arm756(u32 opcode) { LDR_PREDEC(OFFSET_ROR, OP_LDRB, 16); }
1867
+static INSN_REGPARM void arm756(uint32_t opcode) { LDR_PREDEC(OFFSET_ROR, OP_LDRB, 16); }
1868 1868
 // STRB Rd, [Rn, -Rm, LSL #]!
1869
-static INSN_REGPARM void arm760(u32 opcode) { STR_PREDEC_WB(OFFSET_LSL, OP_STRB, 16); }
1869
+static INSN_REGPARM void arm760(uint32_t opcode) { STR_PREDEC_WB(OFFSET_LSL, OP_STRB, 16); }
1870 1870
 // STRB Rd, [Rn, -Rm, LSR #]!
1871
-static INSN_REGPARM void arm762(u32 opcode) { STR_PREDEC_WB(OFFSET_LSR, OP_STRB, 16); }
1871
+static INSN_REGPARM void arm762(uint32_t opcode) { STR_PREDEC_WB(OFFSET_LSR, OP_STRB, 16); }
1872 1872
 // STRB Rd, [Rn, -Rm, ASR #]!
1873
-static INSN_REGPARM void arm764(u32 opcode) { STR_PREDEC_WB(OFFSET_ASR, OP_STRB, 16); }
1873
+static INSN_REGPARM void arm764(uint32_t opcode) { STR_PREDEC_WB(OFFSET_ASR, OP_STRB, 16); }
1874 1874
 // STRB Rd, [Rn, -Rm, ROR #]!
1875
-static INSN_REGPARM void arm766(u32 opcode) { STR_PREDEC_WB(OFFSET_ROR, OP_STRB, 16); }
1875
+static INSN_REGPARM void arm766(uint32_t opcode) { STR_PREDEC_WB(OFFSET_ROR, OP_STRB, 16); }
1876 1876
 // LDRB Rd, [Rn, -Rm, LSL #]!
1877
-static INSN_REGPARM void arm770(u32 opcode) { LDR_PREDEC_WB(OFFSET_LSL, OP_LDRB, 16); }
1877
+static INSN_REGPARM void arm770(uint32_t opcode) { LDR_PREDEC_WB(OFFSET_LSL, OP_LDRB, 16); }
1878 1878
 // LDRB Rd, [Rn, -Rm, LSR #]!
1879
-static INSN_REGPARM void arm772(u32 opcode) { LDR_PREDEC_WB(OFFSET_LSR, OP_LDRB, 16); }
1879
+static INSN_REGPARM void arm772(uint32_t opcode) { LDR_PREDEC_WB(OFFSET_LSR, OP_LDRB, 16); }
1880 1880
 // LDRB Rd, [Rn, -Rm, ASR #]!
1881
-static INSN_REGPARM void arm774(u32 opcode) { LDR_PREDEC_WB(OFFSET_ASR, OP_LDRB, 16); }
1881
+static INSN_REGPARM void arm774(uint32_t opcode) { LDR_PREDEC_WB(OFFSET_ASR, OP_LDRB, 16); }
1882 1882
 // LDRB Rd, [Rn, -Rm, ROR #]!
1883
-static INSN_REGPARM void arm776(u32 opcode) { LDR_PREDEC_WB(OFFSET_ROR, OP_LDRB, 16); }
1883
+static INSN_REGPARM void arm776(uint32_t opcode) { LDR_PREDEC_WB(OFFSET_ROR, OP_LDRB, 16); }
1884 1884
 // STR Rd, [Rn, Rm, LSL #]
1885
-static INSN_REGPARM void arm780(u32 opcode) { STR_PREINC(OFFSET_LSL, OP_STR, 32); }
1885
+static INSN_REGPARM void arm780(uint32_t opcode) { STR_PREINC(OFFSET_LSL, OP_STR, 32); }
1886 1886
 // STR Rd, [Rn, Rm, LSR #]
1887
-static INSN_REGPARM void arm782(u32 opcode) { STR_PREINC(OFFSET_LSR, OP_STR, 32); }
1887
+static INSN_REGPARM void arm782(uint32_t opcode) { STR_PREINC(OFFSET_LSR, OP_STR, 32); }
1888 1888
 // STR Rd, [Rn, Rm, ASR #]
1889
-static INSN_REGPARM void arm784(u32 opcode) { STR_PREINC(OFFSET_ASR, OP_STR, 32); }
1889
+static INSN_REGPARM void arm784(uint32_t opcode) { STR_PREINC(OFFSET_ASR, OP_STR, 32); }
1890 1890
 // STR Rd, [Rn, Rm, ROR #]
1891
-static INSN_REGPARM void arm786(u32 opcode) { STR_PREINC(OFFSET_ROR, OP_STR, 32); }
1891
+static INSN_REGPARM void arm786(uint32_t opcode) { STR_PREINC(OFFSET_ROR, OP_STR, 32); }
1892 1892
 // LDR Rd, [Rn, Rm, LSL #]
1893
-static INSN_REGPARM void arm790(u32 opcode) { LDR_PREINC(OFFSET_LSL, OP_LDR, 32); }
1893
+static INSN_REGPARM void arm790(uint32_t opcode) { LDR_PREINC(OFFSET_LSL, OP_LDR, 32); }
1894 1894
 // LDR Rd, [Rn, Rm, LSR #]
1895
-static INSN_REGPARM void arm792(u32 opcode) { LDR_PREINC(OFFSET_LSR, OP_LDR, 32); }
1895
+static INSN_REGPARM void arm792(uint32_t opcode) { LDR_PREINC(OFFSET_LSR, OP_LDR, 32); }
1896 1896
 // LDR Rd, [Rn, Rm, ASR #]
1897
-static INSN_REGPARM void arm794(u32 opcode) { LDR_PREINC(OFFSET_ASR, OP_LDR, 32); }
1897
+static INSN_REGPARM void arm794(uint32_t opcode) { LDR_PREINC(OFFSET_ASR, OP_LDR, 32); }
1898 1898
 // LDR Rd, [Rn, Rm, ROR #]
1899
-static INSN_REGPARM void arm796(u32 opcode) { LDR_PREINC(OFFSET_ROR, OP_LDR, 32); }
1899
+static INSN_REGPARM void arm796(uint32_t opcode) { LDR_PREINC(OFFSET_ROR, OP_LDR, 32); }
1900 1900
 // STR Rd, [Rn, Rm, LSL #]!
1901
-static INSN_REGPARM void arm7A0(u32 opcode) { STR_PREINC_WB(OFFSET_LSL, OP_STR, 32); }
1901
+static INSN_REGPARM void arm7A0(uint32_t opcode) { STR_PREINC_WB(OFFSET_LSL, OP_STR, 32); }
1902 1902
 // STR Rd, [Rn, Rm, LSR #]!
1903
-static INSN_REGPARM void arm7A2(u32 opcode) { STR_PREINC_WB(OFFSET_LSR, OP_STR, 32); }
1903
+static INSN_REGPARM void arm7A2(uint32_t opcode) { STR_PREINC_WB(OFFSET_LSR, OP_STR, 32); }
1904 1904
 // STR Rd, [Rn, Rm, ASR #]!
1905
-static INSN_REGPARM void arm7A4(u32 opcode) { STR_PREINC_WB(OFFSET_ASR, OP_STR, 32); }
1905
+static INSN_REGPARM void arm7A4(uint32_t opcode) { STR_PREINC_WB(OFFSET_ASR, OP_STR, 32); }
1906 1906
 // STR Rd, [Rn, Rm, ROR #]!
1907
-static INSN_REGPARM void arm7A6(u32 opcode) { STR_PREINC_WB(OFFSET_ROR, OP_STR, 32); }
1907
+static INSN_REGPARM void arm7A6(uint32_t opcode) { STR_PREINC_WB(OFFSET_ROR, OP_STR, 32); }
1908 1908
 // LDR Rd, [Rn, Rm, LSL #]!
1909
-static INSN_REGPARM void arm7B0(u32 opcode) { LDR_PREINC_WB(OFFSET_LSL, OP_LDR, 32); }
1909
+static INSN_REGPARM void arm7B0(uint32_t opcode) { LDR_PREINC_WB(OFFSET_LSL, OP_LDR, 32); }
1910 1910
 // LDR Rd, [Rn, Rm, LSR #]!
1911
-static INSN_REGPARM void arm7B2(u32 opcode) { LDR_PREINC_WB(OFFSET_LSR, OP_LDR, 32); }
1911
+static INSN_REGPARM void arm7B2(uint32_t opcode) { LDR_PREINC_WB(OFFSET_LSR, OP_LDR, 32); }
1912 1912
 // LDR Rd, [Rn, Rm, ASR #]!
1913
-static INSN_REGPARM void arm7B4(u32 opcode) { LDR_PREINC_WB(OFFSET_ASR, OP_LDR, 32); }
1913
+static INSN_REGPARM void arm7B4(uint32_t opcode) { LDR_PREINC_WB(OFFSET_ASR, OP_LDR, 32); }
1914 1914
 // LDR Rd, [Rn, Rm, ROR #]!
1915
-static INSN_REGPARM void arm7B6(u32 opcode) { LDR_PREINC_WB(OFFSET_ROR, OP_LDR, 32); }
1915
+static INSN_REGPARM void arm7B6(uint32_t opcode) { LDR_PREINC_WB(OFFSET_ROR, OP_LDR, 32); }
1916 1916
 // STRB Rd, [Rn, Rm, LSL #]
1917
-static INSN_REGPARM void arm7C0(u32 opcode) { STR_PREINC(OFFSET_LSL, OP_STRB, 16); }
1917
+static INSN_REGPARM void arm7C0(uint32_t opcode) { STR_PREINC(OFFSET_LSL, OP_STRB, 16); }
1918 1918
 // STRB Rd, [Rn, Rm, LSR #]
1919
-static INSN_REGPARM void arm7C2(u32 opcode) { STR_PREINC(OFFSET_LSR, OP_STRB, 16); }
1919
+static INSN_REGPARM void arm7C2(uint32_t opcode) { STR_PREINC(OFFSET_LSR, OP_STRB, 16); }
1920 1920
 // STRB Rd, [Rn, Rm, ASR #]
1921
-static INSN_REGPARM void arm7C4(u32 opcode) { STR_PREINC(OFFSET_ASR, OP_STRB, 16); }
1921
+static INSN_REGPARM void arm7C4(uint32_t opcode) { STR_PREINC(OFFSET_ASR, OP_STRB, 16); }
1922 1922
 // STRB Rd, [Rn, Rm, ROR #]
1923
-static INSN_REGPARM void arm7C6(u32 opcode) { STR_PREINC(OFFSET_ROR, OP_STRB, 16); }
1923
+static INSN_REGPARM void arm7C6(uint32_t opcode) { STR_PREINC(OFFSET_ROR, OP_STRB, 16); }
1924 1924
 // LDRB Rd, [Rn, Rm, LSL #]
1925
-static INSN_REGPARM void arm7D0(u32 opcode) { LDR_PREINC(OFFSET_LSL, OP_LDRB, 16); }
1925
+static INSN_REGPARM void arm7D0(uint32_t opcode) { LDR_PREINC(OFFSET_LSL, OP_LDRB, 16); }
1926 1926
 // LDRB Rd, [Rn, Rm, LSR #]
1927
-static INSN_REGPARM void arm7D2(u32 opcode) { LDR_PREINC(OFFSET_LSR, OP_LDRB, 16); }
1927
+static INSN_REGPARM void arm7D2(uint32_t opcode) { LDR_PREINC(OFFSET_LSR, OP_LDRB, 16); }
1928 1928
 // LDRB Rd, [Rn, Rm, ASR #]
1929
-static INSN_REGPARM void arm7D4(u32 opcode) { LDR_PREINC(OFFSET_ASR, OP_LDRB, 16); }
1929
+static INSN_REGPARM void arm7D4(uint32_t opcode) { LDR_PREINC(OFFSET_ASR, OP_LDRB, 16); }
1930 1930
 // LDRB Rd, [Rn, Rm, ROR #]
1931
-static INSN_REGPARM void arm7D6(u32 opcode) { LDR_PREINC(OFFSET_ROR, OP_LDRB, 16); }
1931
+static INSN_REGPARM void arm7D6(uint32_t opcode) { LDR_PREINC(OFFSET_ROR, OP_LDRB, 16); }
1932 1932
 // STRB Rd, [Rn, Rm, LSL #]!
1933
-static INSN_REGPARM void arm7E0(u32 opcode) { STR_PREINC_WB(OFFSET_LSL, OP_STRB, 16); }
1933
+static INSN_REGPARM void arm7E0(uint32_t opcode) { STR_PREINC_WB(OFFSET_LSL, OP_STRB, 16); }
1934 1934
 // STRB Rd, [Rn, Rm, LSR #]!
1935
-static INSN_REGPARM void arm7E2(u32 opcode) { STR_PREINC_WB(OFFSET_LSR, OP_STRB, 16); }
1935
+static INSN_REGPARM void arm7E2(uint32_t opcode) { STR_PREINC_WB(OFFSET_LSR, OP_STRB, 16); }
1936 1936
 // STRB Rd, [Rn, Rm, ASR #]!
1937
-static INSN_REGPARM void arm7E4(u32 opcode) { STR_PREINC_WB(OFFSET_ASR, OP_STRB, 16); }
1937
+static INSN_REGPARM void arm7E4(uint32_t opcode) { STR_PREINC_WB(OFFSET_ASR, OP_STRB, 16); }
1938 1938
 // STRB Rd, [Rn, Rm, ROR #]!
1939
-static INSN_REGPARM void arm7E6(u32 opcode) { STR_PREINC_WB(OFFSET_ROR, OP_STRB, 16); }
1939
+static INSN_REGPARM void arm7E6(uint32_t opcode) { STR_PREINC_WB(OFFSET_ROR, OP_STRB, 16); }
1940 1940
 // LDRB Rd, [Rn, Rm, LSL #]!
1941
-static INSN_REGPARM void arm7F0(u32 opcode) { LDR_PREINC_WB(OFFSET_LSL, OP_LDRB, 16); }
1941
+static INSN_REGPARM void arm7F0(uint32_t opcode) { LDR_PREINC_WB(OFFSET_LSL, OP_LDRB, 16); }
1942 1942
 // LDRB Rd, [Rn, Rm, LSR #]!
1943
-static INSN_REGPARM void arm7F2(u32 opcode) { LDR_PREINC_WB(OFFSET_LSR, OP_LDRB, 16); }
1943
+static INSN_REGPARM void arm7F2(uint32_t opcode) { LDR_PREINC_WB(OFFSET_LSR, OP_LDRB, 16); }
1944 1944
 // LDRB Rd, [Rn, Rm, ASR #]!
1945
-static INSN_REGPARM void arm7F4(u32 opcode) { LDR_PREINC_WB(OFFSET_ASR, OP_LDRB, 16); }
1945
+static INSN_REGPARM void arm7F4(uint32_t opcode) { LDR_PREINC_WB(OFFSET_ASR, OP_LDRB, 16); }
1946 1946
 // LDRB Rd, [Rn, Rm, ROR #]!
1947
-static INSN_REGPARM void arm7F6(u32 opcode) { LDR_PREINC_WB(OFFSET_ROR, OP_LDRB, 16); }
1947
+static INSN_REGPARM void arm7F6(uint32_t opcode) { LDR_PREINC_WB(OFFSET_ROR, OP_LDRB, 16); }
1948 1948
 
1949 1949
 // STM/LDM ////////////////////////////////////////////////////////////////
1950 1950
 
... ...
@@ -2144,56 +2144,56 @@ static INSN_REGPARM void arm7F6(u32 opcode) { LDR_PREINC_WB(OFFSET_ROR, OP_LDRB,
2144 2144
 
2145 2145
 
2146 2146
 // STMDA Rn, {Rlist}
2147
-static INSN_REGPARM void arm800(u32 opcode)
2147
+static INSN_REGPARM void arm800(uint32_t opcode)
2148 2148
 {
2149 2149
     if (busPrefetchCount == 0)
2150 2150
         busPrefetch = busPrefetchEnable;
2151 2151
     int base = (opcode & 0x000F0000) >> 16;
2152
-    u32 temp = reg[base].I -
2152
+    uint32_t temp = reg[base].I -
2153 2153
         4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2154
-    u32 address = (temp + 4) & 0xFFFFFFFC;
2154
+    uint32_t address = (temp + 4) & 0xFFFFFFFC;
2155 2155
     int count = 0;
2156 2156
     STM_ALL;
2157 2157
     clockTicks += 1 + codeTicksAccess32(armNextPC);
2158 2158
 }
2159 2159
 
2160 2160
 // LDMDA Rn, {Rlist}
2161
-static INSN_REGPARM void arm810(u32 opcode)
2161
+static INSN_REGPARM void arm810(uint32_t opcode)
2162 2162
 {
2163 2163
     if (busPrefetchCount == 0)
2164 2164
         busPrefetch = busPrefetchEnable;
2165 2165
     int base = (opcode & 0x000F0000) >> 16;
2166
-    u32 temp = reg[base].I -
2166
+    uint32_t temp = reg[base].I -
2167 2167
         4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2168
-    u32 address = (temp + 4) & 0xFFFFFFFC;
2168
+    uint32_t address = (temp + 4) & 0xFFFFFFFC;
2169 2169
     int count = 0;
2170 2170
     LDM_ALL;
2171 2171
     clockTicks += 2 + codeTicksAccess32(armNextPC);
2172 2172
 }
2173 2173
 
2174 2174
 // STMDA Rn!, {Rlist}
2175
-static INSN_REGPARM void arm820(u32 opcode)
2175
+static INSN_REGPARM void arm820(uint32_t opcode)
2176 2176
 {
2177 2177
     if (busPrefetchCount == 0)
2178 2178
         busPrefetch = busPrefetchEnable;
2179 2179
     int base = (opcode & 0x000F0000) >> 16;
2180
-    u32 temp = reg[base].I -
2180
+    uint32_t temp = reg[base].I -
2181 2181
         4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2182
-    u32 address = (temp+4) & 0xFFFFFFFC;
2182
+    uint32_t address = (temp+4) & 0xFFFFFFFC;
2183 2183
     int count = 0;
2184 2184
     STMW_ALL;
2185 2185
     clockTicks += 1 + codeTicksAccess32(armNextPC);
2186 2186
 }
2187 2187
 
2188 2188
 // LDMDA Rn!, {Rlist}
2189
-static INSN_REGPARM void arm830(u32 opcode)
2189
+static INSN_REGPARM void arm830(uint32_t opcode)
2190 2190
 {
2191 2191
     if (busPrefetchCount == 0)
2192 2192
         busPrefetch = busPrefetchEnable;
2193 2193
     int base = (opcode & 0x000F0000) >> 16;
2194
-    u32 temp = reg[base].I -
2194
+    uint32_t temp = reg[base].I -
2195 2195
         4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2196
-    u32 address = (temp + 4) & 0xFFFFFFFC;
2196
+    uint32_t address = (temp + 4) & 0xFFFFFFFC;
2197 2197
     int count = 0;
2198 2198
     LDM_ALL;
2199 2199
     clockTicks += 2 + codeTicksAccess32(armNextPC);
... ...
@@ -2202,28 +2202,28 @@ static INSN_REGPARM void arm830(u32 opcode)
2202 2202
 }
2203 2203
 
2204 2204
 // STMDA Rn, {Rlist}^
2205
-static INSN_REGPARM void arm840(u32 opcode)
2205
+static INSN_REGPARM void arm840(uint32_t opcode)
2206 2206
 {
2207 2207
     if (busPrefetchCount == 0)
2208 2208
         busPrefetch = busPrefetchEnable;
2209 2209
     int base = (opcode & 0x000F0000) >> 16;
2210
-    u32 temp = reg[base].I -
2210
+    uint32_t temp = reg[base].I -
2211 2211
         4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2212
-    u32 address = (temp+4) & 0xFFFFFFFC;
2212
+    uint32_t address = (temp+4) & 0xFFFFFFFC;
2213 2213
     int count = 0;
2214 2214
     STM_ALL_2;
2215 2215
     clockTicks += 1 + codeTicksAccess32(armNextPC);
2216 2216
 }
2217 2217
 
2218 2218
 // LDMDA Rn, {Rlist}^
2219
-static INSN_REGPARM void arm850(u32 opcode)
2219
+static INSN_REGPARM void arm850(uint32_t opcode)
2220 2220
 {
2221 2221
     if (busPrefetchCount == 0)
2222 2222
         busPrefetch = busPrefetchEnable;
2223 2223
     int base = (opcode & 0x000F0000) >> 16;
2224
-    u32 temp = reg[base].I -
2224
+    uint32_t temp = reg[base].I -
2225 2225
         4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2226
-    u32 address = (temp + 4) & 0xFFFFFFFC;
2226
+    uint32_t address = (temp + 4) & 0xFFFFFFFC;
2227 2227
     int count = 0;
2228 2228
     LDM_ALL_2;
2229 2229
     LDM_ALL_2B;
... ...
@@ -2231,28 +2231,28 @@ static INSN_REGPARM void arm850(u32 opcode)
2231 2231
 }
2232 2232
 
2233 2233
 // STMDA Rn!, {Rlist}^
2234
-static INSN_REGPARM void arm860(u32 opcode)
2234
+static INSN_REGPARM void arm860(uint32_t opcode)
2235 2235
 {
2236 2236
     if (busPrefetchCount == 0)
2237 2237
         busPrefetch = busPrefetchEnable;
2238 2238
     int base = (opcode & 0x000F0000) >> 16;
2239
-    u32 temp = reg[base].I -
2239
+    uint32_t temp = reg[base].I -
2240 2240
         4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2241
-    u32 address = (temp+4) & 0xFFFFFFFC;
2241
+    uint32_t address = (temp+4) & 0xFFFFFFFC;
2242 2242
     int count = 0;
2243 2243
     STMW_ALL_2;
2244 2244
     clockTicks += 1 + codeTicksAccess32(armNextPC);
2245 2245
 }
2246 2246
 
2247 2247
 // LDMDA Rn!, {Rlist}^
2248
-static INSN_REGPARM void arm870(u32 opcode)
2248
+static INSN_REGPARM void arm870(uint32_t opcode)
2249 2249
 {
2250 2250
     if (busPrefetchCount == 0)
2251 2251
         busPrefetch = busPrefetchEnable;
2252 2252
     int base = (opcode & 0x000F0000) >> 16;
2253
-    u32 temp = reg[base].I -
2253
+    uint32_t temp = reg[base].I -
2254 2254
         4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2255
-    u32 address = (temp + 4) & 0xFFFFFFFC;
2255
+    uint32_t address = (temp + 4) & 0xFFFFFFFC;
2256 2256
     int count = 0;
2257 2257
     LDM_ALL_2;
2258 2258
     if (!(opcode & (1U << base)))
... ...
@@ -2262,52 +2262,52 @@ static INSN_REGPARM void arm870(u32 opcode)
2262 2262
 }
2263 2263
 
2264 2264
 // STMIA Rn, {Rlist}
2265
-static INSN_REGPARM void arm880(u32 opcode)
2265
+static INSN_REGPARM void arm880(uint32_t opcode)
2266 2266
 {
2267 2267
     if (busPrefetchCount == 0)
2268 2268
         busPrefetch = busPrefetchEnable;
2269 2269
     int base = (opcode & 0x000F0000) >> 16;
2270
-    u32 address = reg[base].I & 0xFFFFFFFC;
2270
+    uint32_t address = reg[base].I & 0xFFFFFFFC;
2271 2271
     int count = 0;
2272 2272
     STM_ALL;
2273 2273
     clockTicks += 1 + codeTicksAccess32(armNextPC);
2274 2274
 }
2275 2275
 
2276 2276
 // LDMIA Rn, {Rlist}
2277
-static INSN_REGPARM void arm890(u32 opcode)
2277
+static INSN_REGPARM void arm890(uint32_t opcode)
2278 2278
 {
2279 2279
     if (busPrefetchCount == 0)
2280 2280
         busPrefetch = busPrefetchEnable;
2281 2281
     int base = (opcode & 0x000F0000) >> 16;
2282
-    u32 address = reg[base].I & 0xFFFFFFFC;
2282
+    uint32_t address = reg[base].I & 0xFFFFFFFC;
2283 2283
     int count = 0;
2284 2284
     LDM_ALL;
2285 2285
     clockTicks += 2 + codeTicksAccess32(armNextPC);
2286 2286
 }
2287 2287
 
2288 2288
 // STMIA Rn!, {Rlist}
2289
-static INSN_REGPARM void arm8A0(u32 opcode)
2289
+static INSN_REGPARM void arm8A0(uint32_t opcode)
2290 2290
 {
2291 2291
     if (busPrefetchCount == 0)
2292 2292
         busPrefetch = busPrefetchEnable;
2293 2293
     int base = (opcode & 0x000F0000) >> 16;
2294
-    u32 address = reg[base].I & 0xFFFFFFFC;
2294
+    uint32_t address = reg[base].I & 0xFFFFFFFC;
2295 2295
     int count = 0;
2296
-    u32 temp = reg[base].I +
2296
+    uint32_t temp = reg[base].I +
2297 2297
         4 * (cpuBitsSet[opcode & 0xFF] + cpuBitsSet[(opcode >> 8) & 255]);
2298 2298
     STMW_ALL;
2299 2299
     clockTicks += 1 + codeTicksAccess32(armNextPC);
2300 2300
 }
2301 2301
 
2302 2302
 // LDMIA Rn!, {Rlist}
2303
-static INSN_REGPARM void arm8B0(u32 opcode)
2303
+static INSN_REGPARM void arm8B0(uint32_t opcode)
2304 2304
 {
2305 2305
     if (busPrefetchCount == 0)
2306 2306
         busPrefetch = busPrefetchEnable;
2307 2307
     int base = (opcode & 0x000F0000) >> 16;
2308
-    u32 temp = reg[base].I +
2308
+    uint32_t temp = reg[base].I +
2309 2309
         4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2310
-    u32 address = reg[base].I & 0xFFFFFFFC;
2310
+    uint32_t address = reg[base].I & 0xFFFFFFFC;
2311 2311
     int count = 0;
2312 2312
     LDM_ALL;
2313 2313
     clockTicks += 2 + codeTicksAccess32(armNextPC);
... ...
@@ -2316,24 +2316,24 @@ static INSN_REGPARM void arm8B0(u32 opcode)
2316 2316
 }
2317 2317
 
2318 2318
 // STMIA Rn, {Rlist}^
2319
-static INSN_REGPARM void arm8C0(u32 opcode)
2319
+static INSN_REGPARM void arm8C0(uint32_t opcode)
2320 2320
 {
2321 2321
     if (busPrefetchCount == 0)
2322 2322
         busPrefetch = busPrefetchEnable;
2323 2323
     int base = (opcode & 0x000F0000) >> 16;
2324
-    u32 address = reg[base].I & 0xFFFFFFFC;
2324
+    uint32_t address = reg[base].I & 0xFFFFFFFC;
2325 2325
     int count = 0;
2326 2326
     STM_ALL_2;
2327 2327
     clockTicks += 1 + codeTicksAccess32(armNextPC);
2328 2328
 }
2329 2329
 
2330 2330
 // LDMIA Rn, {Rlist}^
2331
-static INSN_REGPARM void arm8D0(u32 opcode)
2331
+static INSN_REGPARM void arm8D0(uint32_t opcode)
2332 2332
 {
2333 2333
     if (busPrefetchCount == 0)
2334 2334
         busPrefetch = busPrefetchEnable;
2335 2335
     int base = (opcode & 0x000F0000) >> 16;
2336
-    u32 address = reg[base].I & 0xFFFFFFFC;
2336
+    uint32_t address = reg[base].I & 0xFFFFFFFC;
2337 2337
     int count = 0;
2338 2338
     LDM_ALL_2;
2339 2339
     LDM_ALL_2B;
... ...
@@ -2341,28 +2341,28 @@ static INSN_REGPARM void arm8D0(u32 opcode)
2341 2341
 }
2342 2342
 
2343 2343
 // STMIA Rn!, {Rlist}^
2344
-static INSN_REGPARM void arm8E0(u32 opcode)
2344
+static INSN_REGPARM void arm8E0(uint32_t opcode)
2345 2345
 {
2346 2346
     if (busPrefetchCount == 0)
2347 2347
         busPrefetch = busPrefetchEnable;
2348 2348
     int base = (opcode & 0x000F0000) >> 16;
2349
-    u32 address = reg[base].I & 0xFFFFFFFC;
2349
+    uint32_t address = reg[base].I & 0xFFFFFFFC;
2350 2350
     int count = 0;
2351
-    u32 temp = reg[base].I +
2351
+    uint32_t temp = reg[base].I +
2352 2352
         4 * (cpuBitsSet[opcode & 0xFF] + cpuBitsSet[(opcode >> 8) & 255]);
2353 2353
     STMW_ALL_2;
2354 2354
     clockTicks += 1 + codeTicksAccess32(armNextPC);
2355 2355
 }
2356 2356
 
2357 2357
 // LDMIA Rn!, {Rlist}^
2358
-static INSN_REGPARM void arm8F0(u32 opcode)
2358
+static INSN_REGPARM void arm8F0(uint32_t opcode)
2359 2359
 {
2360 2360
     if (busPrefetchCount == 0)
2361 2361
         busPrefetch = busPrefetchEnable;
2362 2362
     int base = (opcode & 0x000F0000) >> 16;
2363
-    u32 temp = reg[base].I +
2363
+    uint32_t temp = reg[base].I +
2364 2364
         4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2365
-    u32 address = reg[base].I & 0xFFFFFFFC;
2365
+    uint32_t address = reg[base].I & 0xFFFFFFFC;
2366 2366
     int count = 0;
2367 2367
     LDM_ALL_2;
2368 2368
     if (!(opcode & (1U << base)))
... ...
@@ -2372,56 +2372,56 @@ static INSN_REGPARM void arm8F0(u32 opcode)
2372 2372
 }
2373 2373
 
2374 2374
 // STMDB Rn, {Rlist}
2375
-static INSN_REGPARM void arm900(u32 opcode)
2375
+static INSN_REGPARM void arm900(uint32_t opcode)
2376 2376
 {
2377 2377
     if (busPrefetchCount == 0)
2378 2378
         busPrefetch = busPrefetchEnable;
2379 2379
     int base = (opcode & 0x000F0000) >> 16;
2380
-    u32 temp = reg[base].I -
2380
+    uint32_t temp = reg[base].I -
2381 2381
         4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2382
-    u32 address = temp & 0xFFFFFFFC;
2382
+    uint32_t address = temp & 0xFFFFFFFC;
2383 2383
     int count = 0;
2384 2384
     STM_ALL;
2385 2385
     clockTicks += 1 + codeTicksAccess32(armNextPC);
2386 2386
 }
2387 2387
 
2388 2388
 // LDMDB Rn, {Rlist}
2389
-static INSN_REGPARM void arm910(u32 opcode)
2389
+static INSN_REGPARM void arm910(uint32_t opcode)
2390 2390
 {
2391 2391
     if (busPrefetchCount == 0)
2392 2392
         busPrefetch = busPrefetchEnable;
2393 2393
     int base = (opcode & 0x000F0000) >> 16;
2394
-    u32 temp = reg[base].I -
2394
+    uint32_t temp = reg[base].I -
2395 2395
         4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2396
-    u32 address = temp & 0xFFFFFFFC;
2396
+    uint32_t address = temp & 0xFFFFFFFC;
2397 2397
     int count = 0;
2398 2398
     LDM_ALL;
2399 2399
     clockTicks += 2 + codeTicksAccess32(armNextPC);
2400 2400
 }
2401 2401
 
2402 2402
 // STMDB Rn!, {Rlist}
2403
-static INSN_REGPARM void arm920(u32 opcode)
2403
+static INSN_REGPARM void arm920(uint32_t opcode)
2404 2404
 {
2405 2405
     if (busPrefetchCount == 0)
2406 2406
         busPrefetch = busPrefetchEnable;
2407 2407
     int base = (opcode & 0x000F0000) >> 16;
2408
-    u32 temp = reg[base].I -
2408
+    uint32_t temp = reg[base].I -
2409 2409
         4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2410
-    u32 address = temp & 0xFFFFFFFC;
2410
+    uint32_t address = temp & 0xFFFFFFFC;
2411 2411
     int count = 0;
2412 2412
     STMW_ALL;
2413 2413
     clockTicks += 1 + codeTicksAccess32(armNextPC);
2414 2414
 }
2415 2415
 
2416 2416
 // LDMDB Rn!, {Rlist}
2417
-static INSN_REGPARM void arm930(u32 opcode)
2417
+static INSN_REGPARM void arm930(uint32_t opcode)
2418 2418
 {
2419 2419
     if (busPrefetchCount == 0)
2420 2420
         busPrefetch = busPrefetchEnable;
2421 2421
     int base = (opcode & 0x000F0000) >> 16;
2422
-    u32 temp = reg[base].I -
2422
+    uint32_t temp = reg[base].I -
2423 2423
         4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2424
-    u32 address = temp & 0xFFFFFFFC;
2424
+    uint32_t address = temp & 0xFFFFFFFC;
2425 2425
     int count = 0;
2426 2426
     LDM_ALL;
2427 2427
     clockTicks += 2 + codeTicksAccess32(armNextPC);
... ...
@@ -2430,28 +2430,28 @@ static INSN_REGPARM void arm930(u32 opcode)
2430 2430
 }
2431 2431
 
2432 2432
 // STMDB Rn, {Rlist}^
2433
-static INSN_REGPARM void arm940(u32 opcode)
2433
+static INSN_REGPARM void arm940(uint32_t opcode)
2434 2434
 {
2435 2435
     if (busPrefetchCount == 0)
2436 2436
         busPrefetch = busPrefetchEnable;
2437 2437
     int base = (opcode & 0x000F0000) >> 16;
2438
-    u32 temp = reg[base].I -
2438
+    uint32_t temp = reg[base].I -
2439 2439
         4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2440
-    u32 address = temp & 0xFFFFFFFC;
2440
+    uint32_t address = temp & 0xFFFFFFFC;
2441 2441
     int count = 0;
2442 2442
     STM_ALL_2;
2443 2443
     clockTicks += 1 + codeTicksAccess32(armNextPC);
2444 2444
 }
2445 2445
 
2446 2446
 // LDMDB Rn, {Rlist}^
2447
-static INSN_REGPARM void arm950(u32 opcode)
2447
+static INSN_REGPARM void arm950(uint32_t opcode)
2448 2448
 {
2449 2449
     if (busPrefetchCount == 0)
2450 2450
         busPrefetch = busPrefetchEnable;
2451 2451
     int base = (opcode & 0x000F0000) >> 16;
2452
-    u32 temp = reg[base].I -
2452
+    uint32_t temp = reg[base].I -
2453 2453
         4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2454
-    u32 address = temp & 0xFFFFFFFC;
2454
+    uint32_t address = temp & 0xFFFFFFFC;
2455 2455
     int count = 0;
2456 2456
     LDM_ALL_2;
2457 2457
     LDM_ALL_2B;
... ...
@@ -2459,28 +2459,28 @@ static INSN_REGPARM void arm950(u32 opcode)
2459 2459
 }
2460 2460
 
2461 2461
 // STMDB Rn!, {Rlist}^
2462
-static INSN_REGPARM void arm960(u32 opcode)
2462
+static INSN_REGPARM void arm960(uint32_t opcode)
2463 2463
 {
2464 2464
     if (busPrefetchCount == 0)
2465 2465
         busPrefetch = busPrefetchEnable;
2466 2466
     int base = (opcode & 0x000F0000) >> 16;
2467
-    u32 temp = reg[base].I -
2467
+    uint32_t temp = reg[base].I -
2468 2468
         4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2469
-    u32 address = temp & 0xFFFFFFFC;
2469
+    uint32_t address = temp & 0xFFFFFFFC;
2470 2470
     int count = 0;
2471 2471
     STMW_ALL_2;
2472 2472
     clockTicks += 1 + codeTicksAccess32(armNextPC);
2473 2473
 }
2474 2474
 
2475 2475
 // LDMDB Rn!, {Rlist}^
2476
-static INSN_REGPARM void arm970(u32 opcode)
2476
+static INSN_REGPARM void arm970(uint32_t opcode)
2477 2477
 {
2478 2478
     if (busPrefetchCount == 0)
2479 2479
         busPrefetch = busPrefetchEnable;
2480 2480
     int base = (opcode & 0x000F0000) >> 16;
2481
-    u32 temp = reg[base].I -
2481
+    uint32_t temp = reg[base].I -
2482 2482
         4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2483
-    u32 address = temp & 0xFFFFFFFC;
2483
+    uint32_t address = temp & 0xFFFFFFFC;
2484 2484
     int count = 0;
2485 2485
     LDM_ALL_2;
2486 2486
     if (!(opcode & (1U << base)))
... ...
@@ -2490,52 +2490,52 @@ static INSN_REGPARM void arm970(u32 opcode)
2490 2490
 }
2491 2491
 
2492 2492
 // STMIB Rn, {Rlist}
2493
-static INSN_REGPARM void arm980(u32 opcode)
2493
+static INSN_REGPARM void arm980(uint32_t opcode)
2494 2494
 {
2495 2495
     if (busPrefetchCount == 0)
2496 2496
         busPrefetch = busPrefetchEnable;
2497 2497
     int base = (opcode & 0x000F0000) >> 16;
2498
-    u32 address = (reg[base].I+4) & 0xFFFFFFFC;
2498
+    uint32_t address = (reg[base].I+4) & 0xFFFFFFFC;
2499 2499
     int count = 0;
2500 2500
     STM_ALL;
2501 2501
     clockTicks += 1 + codeTicksAccess32(armNextPC);
2502 2502
 }
2503 2503
 
2504 2504
 // LDMIB Rn, {Rlist}
2505
-static INSN_REGPARM void arm990(u32 opcode)
2505
+static INSN_REGPARM void arm990(uint32_t opcode)
2506 2506
 {
2507 2507
     if (busPrefetchCount == 0)
2508 2508
         busPrefetch = busPrefetchEnable;
2509 2509
     int base = (opcode & 0x000F0000) >> 16;
2510
-    u32 address = (reg[base].I+4) & 0xFFFFFFFC;
2510
+    uint32_t address = (reg[base].I+4) & 0xFFFFFFFC;
2511 2511
     int count = 0;
2512 2512
     LDM_ALL;
2513 2513
     clockTicks += 2 + codeTicksAccess32(armNextPC);
2514 2514
 }
2515 2515
 
2516 2516
 // STMIB Rn!, {Rlist}
2517
-static INSN_REGPARM void arm9A0(u32 opcode)
2517
+static INSN_REGPARM void arm9A0(uint32_t opcode)
2518 2518
 {
2519 2519
     if (busPrefetchCount == 0)
2520 2520
         busPrefetch = busPrefetchEnable;
2521 2521
     int base = (opcode & 0x000F0000) >> 16;
2522
-    u32 address = (reg[base].I+4) & 0xFFFFFFFC;
2522
+    uint32_t address = (reg[base].I+4) & 0xFFFFFFFC;
2523 2523
     int count = 0;
2524
-    u32 temp = reg[base].I +
2524
+    uint32_t temp = reg[base].I +
2525 2525
         4 * (cpuBitsSet[opcode & 0xFF] + cpuBitsSet[(opcode >> 8) & 255]);
2526 2526
     STMW_ALL;
2527 2527
     clockTicks += 1 + codeTicksAccess32(armNextPC);
2528 2528
 }
2529 2529
 
2530 2530
 // LDMIB Rn!, {Rlist}
2531
-static INSN_REGPARM void arm9B0(u32 opcode)
2531
+static INSN_REGPARM void arm9B0(uint32_t opcode)
2532 2532
 {
2533 2533
     if (busPrefetchCount == 0)
2534 2534
         busPrefetch = busPrefetchEnable;
2535 2535
     int base = (opcode & 0x000F0000) >> 16;
2536
-    u32 temp = reg[base].I +
2536
+    uint32_t temp = reg[base].I +
2537 2537
         4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2538
-    u32 address = (reg[base].I+4) & 0xFFFFFFFC;
2538
+    uint32_t address = (reg[base].I+4) & 0xFFFFFFFC;
2539 2539
     int count = 0;
2540 2540
     LDM_ALL;
2541 2541
     clockTicks += 2 + codeTicksAccess32(armNextPC);
... ...
@@ -2544,24 +2544,24 @@ static INSN_REGPARM void arm9B0(u32 opcode)
2544 2544
 }
2545 2545
 
2546 2546
 // STMIB Rn, {Rlist}^
2547
-static INSN_REGPARM void arm9C0(u32 opcode)
2547
+static INSN_REGPARM void arm9C0(uint32_t opcode)
2548 2548
 {
2549 2549
     if (busPrefetchCount == 0)
2550 2550
         busPrefetch = busPrefetchEnable;
2551 2551
     int base = (opcode & 0x000F0000) >> 16;
2552
-    u32 address = (reg[base].I+4) & 0xFFFFFFFC;
2552
+    uint32_t address = (reg[base].I+4) & 0xFFFFFFFC;
2553 2553
     int count = 0;
2554 2554
     STM_ALL_2;
2555 2555
     clockTicks += 1 + codeTicksAccess32(armNextPC);
2556 2556
 }
2557 2557
 
2558 2558
 // LDMIB Rn, {Rlist}^
2559
-static INSN_REGPARM void arm9D0(u32 opcode)
2559
+static INSN_REGPARM void arm9D0(uint32_t opcode)
2560 2560
 {
2561 2561
     if (busPrefetchCount == 0)
2562 2562
         busPrefetch = busPrefetchEnable;
2563 2563
     int base = (opcode & 0x000F0000) >> 16;
2564
-    u32 address = (reg[base].I+4) & 0xFFFFFFFC;
2564
+    uint32_t address = (reg[base].I+4) & 0xFFFFFFFC;
2565 2565
     int count = 0;
2566 2566
     LDM_ALL_2;
2567 2567
     LDM_ALL_2B;
... ...
@@ -2569,28 +2569,28 @@ static INSN_REGPARM void arm9D0(u32 opcode)
2569 2569
 }
2570 2570
 
2571 2571
 // STMIB Rn!, {Rlist}^
2572
-static INSN_REGPARM void arm9E0(u32 opcode)
2572
+static INSN_REGPARM void arm9E0(uint32_t opcode)
2573 2573
 {
2574 2574
     if (busPrefetchCount == 0)
2575 2575
         busPrefetch = busPrefetchEnable;
2576 2576
     int base = (opcode & 0x000F0000) >> 16;
2577
-    u32 address = (reg[base].I+4) & 0xFFFFFFFC;
2577
+    uint32_t address = (reg[base].I+4) & 0xFFFFFFFC;
2578 2578
     int count = 0;
2579
-    u32 temp = reg[base].I +
2579
+    uint32_t temp = reg[base].I +
2580 2580
         4 * (cpuBitsSet[opcode & 0xFF] + cpuBitsSet[(opcode >> 8) & 255]);
2581 2581
     STMW_ALL_2;
2582 2582
     clockTicks += 1 + codeTicksAccess32(armNextPC);
2583 2583
 }
2584 2584
 
2585 2585
 // LDMIB Rn!, {Rlist}^
2586
-static INSN_REGPARM void arm9F0(u32 opcode)
2586
+static INSN_REGPARM void arm9F0(uint32_t opcode)
2587 2587
 {
2588 2588
     if (busPrefetchCount == 0)
2589 2589
         busPrefetch = busPrefetchEnable;
2590 2590
     int base = (opcode & 0x000F0000) >> 16;
2591
-    u32 temp = reg[base].I +
2591
+    uint32_t temp = reg[base].I +
2592 2592
         4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2593
-    u32 address = (reg[base].I+4) & 0xFFFFFFFC;
2593
+    uint32_t address = (reg[base].I+4) & 0xFFFFFFFC;
2594 2594
     int count = 0;
2595 2595
     LDM_ALL_2;
2596 2596
     if (!(opcode & (1U << base)))
... ...
@@ -2602,7 +2602,7 @@ static INSN_REGPARM void arm9F0(u32 opcode)
2602 2602
 // B/BL/SWI and (unimplemented) coproc support ////////////////////////////
2603 2603
 
2604 2604
 // B <offset>
2605
-static INSN_REGPARM void armA00(u32 opcode)
2605
+static INSN_REGPARM void armA00(uint32_t opcode)
2606 2606
 {
2607 2607
     int offset = opcode & 0x00FFFFFF;
2608 2608
     if (offset & 0x00800000)
... ...
@@ -2617,7 +2617,7 @@ static INSN_REGPARM void armA00(u32 opcode)
2617 2617
 }
2618 2618
 
2619 2619
 // BL <offset>
2620
-static INSN_REGPARM void armB00(u32 opcode)
2620
+static INSN_REGPARM void armB00(uint32_t opcode)
2621 2621
 {
2622 2622
     int offset = opcode & 0x00FFFFFF;
2623 2623
     if (offset & 0x00800000)
... ...
@@ -2636,7 +2636,7 @@ static INSN_REGPARM void armB00(u32 opcode)
2636 2636
 
2637 2637
 #ifdef GP_SUPPORT
2638 2638
 // MRC
2639
-static INSN_REGPARM void armE01(u32 opcode)
2639
+static INSN_REGPARM void armE01(uint32_t opcode)
2640 2640
 {
2641 2641
 }
2642 2642
 #else
... ...
@@ -2645,7 +2645,7 @@ static INSN_REGPARM void armE01(u32 opcode)
2645 2645
 
2646 2646
 
2647 2647
 // SWI <comment>
2648
-static INSN_REGPARM void armF00(u32 opcode)
2648
+static INSN_REGPARM void armF00(uint32_t opcode)
2649 2649
 {
2650 2650
     clockTicks = codeTicksAccessSeq32(armNextPC) + 1;
2651 2651
         clockTicks = (clockTicks * 2) + codeTicksAccess32(armNextPC) + 1;
... ...
@@ -2655,7 +2655,7 @@ static INSN_REGPARM void armF00(u32 opcode)
2655 2655
 
2656 2656
 // Instruction table //////////////////////////////////////////////////////
2657 2657
 
2658
-typedef INSN_REGPARM void (*insnfunc_t)(u32 opcode);
2658
+typedef INSN_REGPARM void (*insnfunc_t)(uint32_t opcode);
2659 2659
 #define REP16(insn) \
2660 2660
     insn,insn,insn,insn,insn,insn,insn,insn,\
2661 2661
     insn,insn,insn,insn,insn,insn,insn,insn
... ...
@@ -2874,7 +2874,7 @@ int armExecute()
2874 2874
         if ((armNextPC & 0x0803FFFF) == 0x08020000)
2875 2875
           busPrefetchCount = 0x100;
2876 2876
 
2877
-        u32 opcode = cpuPrefetch[0];
2877
+        uint32_t opcode = cpuPrefetch[0];
2878 2878
         cpuPrefetch[0] = cpuPrefetch[1];
2879 2879
 
2880 2880
         busPrefetch = false;
Browse code

Removed the save state loading from the 2SF player and updated the VBA-M code to the latest revision.

Naram Qashat authored on 2013/04/12 20:27:27
Showing 1 changed files
... ...
@@ -356,7 +356,11 @@ static void count(u32 opcode, int cond_res)
356 356
         EMIT2(and, KONST(0x1F), ecx)
357 357
 #define VALUE_LOAD_REG \
358 358
         EMIT2(and, KONST(0x0F), eax)            \
359
+                EMIT2(cmp, KONST(0x0F), eax)                    \
359 360
         EMIT2(mov, REGREF2(eax,4), eax)         \
361
+                EMIT1(jne, LABELREF(3,f))                               \
362
+                EMIT2(add, KONST(4), eax)                               \
363
+                LABEL(3)                                                                \
360 364
         EMIT2(movzx, ch, ecx)                   \
361 365
         EMIT2(and, KONST(0x0F), ecx)            \
362 366
         EMIT2(mov, REGREF2(ecx,4), ecx)
... ...
@@ -753,13 +757,17 @@ static void count(u32 opcode, int cond_res)
753 757
 // OP Rd,Rb,Rm LSL Rs
754 758
 #ifndef VALUE_LSL_REG_C
755 759
  #define VALUE_LSL_REG_C \
756
-    unsigned int shift = reg[(opcode >> 8)&15].B.B0;    \
760
+    u32 shift = reg[(opcode >> 8)&15].B.B0;                  \
761
+    u32 rm = reg[opcode & 0x0F].I;                           \
762
+    if((opcode & 0x0F) == 15) {                              \
763
+        rm += 4;                                             \
764
+    }                                                        \
757 765
     if (LIKELY(shift)) {                                \
758 766
         if (shift == 32) {                              \
759 767
             value = 0;                                  \
760
-            C_OUT = (reg[opcode & 0x0F].I & 1 ? true : false);\
768
+            C_OUT = (rm & 1 ? true : false);                 \
761 769
         } else if (LIKELY(shift < 32)) {                \
762
-            u32 v = reg[opcode & 0x0F].I;               \
770
+            u32 v = rm;                                      \
763 771
             C_OUT = (v >> (32 - shift)) & 1 ? true : false;\
764 772
             value = v << shift;                         \
765 773
         } else {                                        \
... ...
@@ -767,13 +775,13 @@ static void count(u32 opcode, int cond_res)
767 775
             C_OUT = false;                              \
768 776
         }                                               \
769 777
     } else {                                            \
770
-        value = reg[opcode & 0x0F].I;                   \
778
+        value = rm;                                          \
771 779
     }
772 780
 #endif
773 781
 // OP Rd,Rb,Rm LSR #
774 782
 #ifndef VALUE_LSR_IMM_C
775 783
  #define VALUE_LSR_IMM_C \
776
-    unsigned int shift = (opcode >> 7) & 0x1F;          \
784
+    u32 shift = (opcode >> 7) & 0x1F;                   \
777 785
     if (LIKELY(shift)) {                                \
778 786
         u32 v = reg[opcode & 0x0F].I;                   \
779 787
         C_OUT = (v >> (shift - 1)) & 1 ? true : false;  \
... ...
@@ -787,12 +795,16 @@ static void count(u32 opcode, int cond_res)
787 795
 #ifndef VALUE_LSR_REG_C
788 796
  #define VALUE_LSR_REG_C \
789 797
     unsigned int shift = reg[(opcode >> 8)&15].B.B0;    \
798
+    u32 rm = reg[opcode & 0x0F].I;                      \
799
+    if((opcode & 0x0F) == 15) {                         \
800
+        rm += 4;                                            \
801
+    }                                                   \
790 802
     if (LIKELY(shift)) {                                \
791 803
         if (shift == 32) {                              \
792 804
             value = 0;                                  \
793
-            C_OUT = (reg[opcode & 0x0F].I & 0x80000000 ? true : false);\
805
+            C_OUT = (rm & 0x80000000 ? true : false);\
794 806
         } else if (LIKELY(shift < 32)) {                \
795
-            u32 v = reg[opcode & 0x0F].I;               \
807
+            u32 v = rm;               \
796 808
             C_OUT = (v >> (shift - 1)) & 1 ? true : false;\
797 809
             value = v >> shift;                         \
798 810
         } else {                                        \
... ...
@@ -800,7 +812,7 @@ static void count(u32 opcode, int cond_res)
800 812
             C_OUT = false;                              \
801 813
         }                                               \
802 814
     } else {                                            \
803
-        value = reg[opcode & 0x0F].I;                   \
815
+        value = rm;                   \
804 816
     }
805 817
 #endif
806 818
 // OP Rd,Rb,Rm ASR #
... ...
@@ -826,13 +838,17 @@ static void count(u32 opcode, int cond_res)
826 838
 #ifndef VALUE_ASR_REG_C
827 839
  #define VALUE_ASR_REG_C \
828 840
     unsigned int shift = reg[(opcode >> 8)&15].B.B0;    \
841
+    u32 rm = reg[opcode & 0x0F].I;                      \
842
+    if((opcode & 0x0F) == 15) {                         \
843
+        rm += 4;                                            \
844
+    }                                                   \
829 845
     if (LIKELY(shift < 32)) {                           \
830 846
         if (LIKELY(shift)) {                            \
831
-            s32 v = reg[opcode & 0x0F].I;               \
847
+            s32 v = rm;               \
832 848
             C_OUT = (v >> (int)(shift - 1)) & 1 ? true : false;\
833 849
             value = v >> (int)shift;                    \
834 850
         } else {                                        \
835
-            value = reg[opcode & 0x0F].I;               \
851
+            value = rm;               \
836 852
         }                                               \
837 853
     } else {                                            \
838 854
         if (reg[opcode & 0x0F].I & 0x80000000) {        \
... ...
@@ -864,13 +880,17 @@ static void count(u32 opcode, int cond_res)
864 880
 #ifndef VALUE_ROR_REG_C
865 881
  #define VALUE_ROR_REG_C \
866 882
     unsigned int shift = reg[(opcode >> 8)&15].B.B0;    \
883
+    u32 rm = reg[opcode & 0x0F].I;                      \
884
+    if((opcode & 0x0F) == 15) {                         \
885
+        rm += 4;                                            \
886
+    }                                                   \
867 887
     if (LIKELY(shift & 0x1F)) {                         \
868
-        u32 v = reg[opcode & 0x0F].I;                   \
888
+        u32 v = rm;                   \
869 889
         C_OUT = (v >> (shift - 1)) & 1 ? true : false;  \
870 890
         value = ((v << (32 - shift)) |                  \
871 891
                  (v >> shift));                         \
872 892
     } else {                                            \
873
-        value = reg[opcode & 0x0F].I;                   \
893
+        value = rm;                   \
874 894
         if (shift)                                      \
875 895
             C_OUT = (value & 0x80000000 ? true : false);\
876 896
     }
... ...
@@ -951,9 +971,9 @@ static void count(u32 opcode, int cond_res)
951 971
 #endif
952 972
 #ifndef OP_RSB
953 973
  #define OP_RSB \
954
-    u32 lhs = reg[(opcode>>16)&15].I;                   \
955
-    u32 rhs = value;                                    \
956
-    u32 res = rhs - lhs;                                \
974
+    u32 lhs = value;                                    \
975
+    u32 rhs = reg[(opcode>>16)&15].I;                   \
976
+    u32 res = lhs - rhs;                                \
957 977
     reg[dest].I = res;
958 978
 #endif
959 979
 #ifndef OP_RSBS
... ...
@@ -991,9 +1011,9 @@ static void count(u32 opcode, int cond_res)
991 1011
 #endif
992 1012
 #ifndef OP_RSC
993 1013
  #define OP_RSC \
994
-    u32 lhs = reg[(opcode>>16)&15].I;                   \
995
-    u32 rhs = value;                                    \
996
-    u32 res = rhs - lhs - !((u32)C_FLAG);               \
1014
+    u32 lhs = value;                                    \
1015
+    u32 rhs = reg[(opcode>>16)&15].I;                   \
1016
+    u32 res = lhs - rhs - !((u32)C_FLAG);               \
997 1017
     reg[dest].I = res;
998 1018
 #endif
999 1019
 #ifndef OP_RSCS
... ...
@@ -1517,7 +1537,7 @@ static INSN_REGPARM void arm121(u32 opcode)
1517 1537
 #define OP_LDR    reg[dest].I = CPUReadMemory(address)
1518 1538
 #define OP_LDRH   reg[dest].I = CPUReadHalfWord(address)
1519 1539
 #define OP_LDRB   reg[dest].I = CPUReadByte(address)
1520
-#define OP_LDRSH  reg[dest].I = (s16)CPUReadHalfWordSigned(address)
1540
+#define OP_LDRSH  reg[dest].I = (u32)CPUReadHalfWordSigned(address)
1521 1541
 #define OP_LDRSB  reg[dest].I = (s8)CPUReadByte(address)
1522 1542
 
1523 1543
 #define WRITEBACK_NONE     /*nothing*/
... ...
@@ -2592,8 +2612,7 @@ static INSN_REGPARM void armA00(u32 opcode)
2592 2612
     reg[15].I += 4;
2593 2613
     ARM_PREFETCH;
2594 2614
     clockTicks = codeTicksAccessSeq32(armNextPC) + 1;
2595
-    clockTicks += 2 + codeTicksAccess32(armNextPC)
2596
-                    + codeTicksAccessSeq32(armNextPC);
2615
+    clockTicks = (clockTicks * 2) + codeTicksAccess32(armNextPC) + 1;
2597 2616
     busPrefetchCount = 0;
2598 2617
 }
2599 2618
 
... ...
@@ -2629,8 +2648,7 @@ static INSN_REGPARM void armE01(u32 opcode)
2629 2648
 static INSN_REGPARM void armF00(u32 opcode)
2630 2649
 {
2631 2650
     clockTicks = codeTicksAccessSeq32(armNextPC) + 1;
2632
-    clockTicks += 2 + codeTicksAccess32(armNextPC)
2633
-                    + codeTicksAccessSeq32(armNextPC);
2651
+        clockTicks = (clockTicks * 2) + codeTicksAccess32(armNextPC) + 1;
2634 2652
     busPrefetchCount = 0;
2635 2653
     CPUSoftwareInterrupt(opcode & 0x00FFFFFF);
2636 2654
 }
... ...
@@ -2682,9 +2700,9 @@ static insnfunc_t armInsnTable[4096] = {
2682 2700
     arm0D0,arm0D1,arm0D2,arm0D3,arm0D4,arm0D5,arm0D6,arm0D7,  // 0D0
2683 2701
     arm0D0,arm0D9,arm0D2,arm0DB,arm0D4,arm0DD,arm0D6,arm0DF,  // 0D8
2684 2702
     arm0E0,arm0E1,arm0E2,arm0E3,arm0E4,arm0E5,arm0E6,arm0E7,  // 0E0
2685
-    arm0E0,arm0E9,arm0E2,arm_UI,arm0E4,arm_UI,arm0E6,arm_UI,  // 0E8
2703
+    arm0E0,arm0E9,arm0E2,arm0CB,arm0E4,arm_UI,arm0E6,arm_UI,  // 0E8
2686 2704
     arm0F0,arm0F1,arm0F2,arm0F3,arm0F4,arm0F5,arm0F6,arm0F7,  // 0F0
2687
-    arm0F0,arm0F9,arm0F2,arm_UI,arm0F4,arm0DD,arm0F6,arm0DF,  // 0F8
2705
+    arm0F0,arm0F9,arm0F2,arm0DB,arm0F4,arm0DD,arm0F6,arm0DF,  // 0F8
2688 2706
 
2689 2707
     arm100,arm_UI,arm_UI,arm_UI,arm_UI,arm_UI,arm_UI,arm_UI,  // 100
2690 2708
     arm_UI,arm109,arm_UI,arm10B,arm_UI,arm_UI,arm_UI,arm_UI,  // 108
Browse code

Import actual code.

Naram Qashat authored on 2013/03/26 02:41:19
Showing 1 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,2950 @@
1
+#include <stdio.h>
2
+#include <stdlib.h>
3
+#include <memory.h>
4
+#include <stdarg.h>
5
+#include <string.h>
6
+
7
+#include "GBA.h"
8
+#include "GBAcpu.h"
9
+#include "GBAinline.h"
10
+#include "Globals.h"
11
+//#include "EEprom.h"
12
+//#include "Flash.h"
13
+#include "Sound.h"
14
+//#include "Sram.h"
15
+#include "bios.h"
16
+//#include "Cheats.h"
17
+//#include "../NLS.h"
18
+//#include "elf.h"
19
+//#include "../Util.h"
20
+//#include "../System.h"
21
+//#include "agbprint.h"
22
+#ifdef PROFILING
23
+#include "prof/prof.h"
24
+#endif
25
+
26
+#ifdef _MSC_VER
27
+ // Disable "empty statement" warnings
28
+ #pragma warning(disable: 4390)
29
+ // Visual C's inline assembler treats "offset" as a reserved word, so we
30
+ // tell it otherwise.  If you want to use it, write "OFFSET" in capitals.
31
+ #define offset offset_
32
+#endif
33
+
34
+///////////////////////////////////////////////////////////////////////////
35
+
36
+static int clockTicks;
37
+
38
+static INSN_REGPARM void armUnknownInsn(u32 opcode)
39
+{
40
+#ifdef GBA_LOGGING
41
+    if (systemVerbose & VERBOSE_UNDEFINED) {
42
+        log("Undefined ARM instruction %08x at %08x\n", opcode,
43
+            armNextPC-4);
44
+    }
45
+#endif
46
+    CPUUndefinedException();
47
+}
48
+
49
+#ifdef BKPT_SUPPORT
50
+static INSN_REGPARM void armBreakpoint(u32 opcode)
51
+{
52
+    reg[15].I -= 4;
53
+    armNextPC -= 4;
54
+    dbgSignal(5, (opcode & 0x0f) | ((opcode>>4) & 0xfff0));
55
+    clockTicks = -1;
56
+}
57
+#endif
58
+
59
+
60
+// Subroutine to count instructions (for debugging/optimizing)
61
+//#define INSN_COUNTER  // comment out if you don't want it
62
+#ifdef INSN_COUNTER
63
+static void count(u32 opcode, int cond_res)
64
+{
65
+    static int insncount = 0;    // number of insns seen
66
+    static int executed = 0;     // number of insns executed
67
+    static int mergewith[4096];  // map instructions to routines
68
+    static int count[4096];      // count of each 12-bit code
69
+    int index = ((opcode>>16)&0xFF0) | ((opcode>>4)&0x0F);
70
+    static FILE *outfile = NULL;
71
+
72
+    if (!insncount) {
73
+        for (int i = 0; i < 4096; i++) {
74
+            for (int j = 0; j < i; j++) {
75
+                if (armInsnTable[i] == armInsnTable[j])
76
+                    break;
77
+            }
78
+            mergewith[i] = j;
79
+        }
80
+        outfile = fopen("VBA-armcount.txt", "w");
81
+    }
82
+    if (cond_res) {
83
+        count[mergewith[index]]++;
84
+        executed++;
85
+    }
86
+    insncount++;
87
+    if (outfile && insncount%1000000 == 0) {
88
+        fprintf(outfile, "Total instructions: %d\n", insncount);
89
+        fprintf(outfile, "Instructions executed: %d\n", executed);
90
+        for (int i = 0; i < 4096; i++) {
91
+            if (count[i])
92
+                fprintf(outfile, "arm%03X: %d\n", i, count[i]);
93
+        }
94
+    }
95
+}
96
+#endif
97
+
98
+// Common macros //////////////////////////////////////////////////////////
99
+
100
+#ifdef BKPT_SUPPORT
101
+#define CONSOLE_OUTPUT(a,b) do { \
102
+    if ((opcode == 0xe0000000) && (reg[0].I == 0xC0DED00D)) {   \
103
+        dbgOutput((a), (b));                                    \
104
+} while (0)
105
+#else
106
+#define CONSOLE_OUTPUT(a,b)  /* nothing */
107
+#endif
108
+
109
+#define NEG(i) ((i) >> 31)
110
+#define POS(i) ((~(i)) >> 31)
111
+
112
+// The following macros are used for optimization; any not defined for a
113
+// particular compiler/CPU combination default to the C core versions.
114
+//
115
+//    ALU_INIT_C:   Used at the beginning of ALU instructions (AND/EOR/...).
116
+//    (ALU_INIT_NC) Can consist of variable declarations, like the C core,
117
+//                  or the start of a continued assembly block, like the
118
+//                  x86-optimized version.  The _C version is used when the
119
+//                  carry flag from the shift operation is needed (logical
120
+//                  operations that set condition codes, like ANDS); the
121
+//                  _NC version is used when the carry result is ignored.
122
+//    VALUE_XXX: Retrieve the second operand's value for an ALU instruction.
123
+//               The _C and _NC versions are used the same way as ALU_INIT.
124
+//    OP_XXX: ALU operations.  XXX is the instruction name.
125
+//    ALU_FINISH: Appended to all ALU instructions.  Usually empty, but if
126
+//                ALU_INIT started a block ALU_FINISH can be used to end it
127
+//                (as with the asm(...) statement in the x86 core).
128
+//    SETCOND_NONE: Used in multiply instructions in place of SETCOND_MUL
129
+//                  when the condition codes are not set.  Usually empty.
130
+//    SETCOND_MUL: Used in multiply instructions to set the condition codes.
131
+//    ROR_IMM_MSR: Used to rotate the immediate operand for MSR.
132
+//    ROR_OFFSET: Used to rotate the `offset' parameter for LDR and STR
133
+//                instructions.
134
+//    RRX_OFFSET: Used to rotate (RRX) the `offset' parameter for LDR and
135
+//                STR instructions.
136
+
137
+#ifndef C_CORE
138
+
139
+#if 0  // definitions have changed
140
+//#ifdef __POWERPC__
141
+            #define OP_SUBS \
142
+            {\
143
+                register int Flags;                             \
144
+                register int Result;                            \
145
+                asm volatile("subco. %0, %2, %3\n"              \
146
+                            "mcrxr cr1\n"                       \
147
+                            "mfcr %1\n"                         \
148
+                            : "=r" (Result),                    \
149
+                              "=r" (Flags)                      \
150
+                            : "r" (reg[base].I),                \
151
+                              "r" (value)                       \
152
+                            );                                  \
153
+                reg[dest].I = Result;                           \
154
+                Z_FLAG = (Flags >> 29) & 1;                     \
155
+                N_FLAG = (Flags >> 31) & 1;                     \
156
+                C_FLAG = (Flags >> 25) & 1;                     \
157
+                V_FLAG = (Flags >> 26) & 1;                     \
158
+            }
159
+            #define OP_RSBS \
160
+            {\
161
+                register int Flags;                             \
162
+                register int Result;                            \
163
+                asm volatile("subfco. %0, %2, %3\n"             \
164
+                            "mcrxr cr1\n"                       \
165
+                            "mfcr %1\n"                         \
166
+                            : "=r" (Result),                    \
167
+                              "=r" (Flags)                      \
168
+                            : "r" (reg[base].I),                \
169
+                              "r" (value)                       \
170
+                            );                                  \
171
+                reg[dest].I = Result;                           \
172
+                Z_FLAG = (Flags >> 29) & 1;                     \
173
+                N_FLAG = (Flags >> 31) & 1;                     \
174
+                C_FLAG = (Flags >> 25) & 1;                     \
175
+                V_FLAG = (Flags >> 26) & 1;                     \
176
+            }
177
+            #define OP_ADDS \
178
+            {\
179
+                register int Flags;                             \
180
+                register int Result;                            \
181
+                asm volatile("addco. %0, %2, %3\n"              \
182
+                            "mcrxr cr1\n"                       \
183
+                            "mfcr %1\n"                         \
184
+                            : "=r" (Result),                    \
185
+                              "=r" (Flags)                      \
186
+                            : "r" (reg[base].I),                \
187
+                              "r" (value)                       \
188
+                            );                                  \
189
+                reg[dest].I = Result;                           \
190
+                Z_FLAG = (Flags >> 29) & 1;                     \
191
+                N_FLAG = (Flags >> 31) & 1;                     \
192
+                C_FLAG = (Flags >> 25) & 1;                     \
193
+                V_FLAG = (Flags >> 26) & 1;                     \
194
+            }
195
+            #define OP_ADCS \
196
+            {\
197
+                register int Flags;                             \
198
+                register int Result;                            \
199
+                asm volatile("mtspr xer, %4\n"                  \
200
+                             "addeo. %0, %2, %3\n"              \
201
+                             "mcrxr cr1\n"                      \
202
+                             "mfcr      %1\n"                   \
203
+                             : "=r" (Result),                   \
204
+                               "=r" (Flags)                     \
205
+                             : "r" (reg[base].I),               \
206
+                               "r" (value),                     \
207
+                               "r" (C_FLAG << 29)               \
208
+                             );                                 \
209
+                reg[dest].I = Result;                           \
210
+                Z_FLAG = (Flags >> 29) & 1;                     \
211
+                N_FLAG = (Flags >> 31) & 1;                     \
212
+                C_FLAG = (Flags >> 25) & 1;                     \
213
+                V_FLAG = (Flags >> 26) & 1;                     \
214
+            }
215
+            #define OP_SBCS \
216
+            {\
217
+                register int Flags;                             \
218
+                register int Result;                            \
219
+                asm volatile("mtspr xer, %4\n"                  \
220
+                             "subfeo. %0, %3, %2\n"             \
221
+                             "mcrxr cr1\n"                      \
222
+                             "mfcr      %1\n"                   \
223
+                             : "=r" (Result),                   \
224
+                               "=r" (Flags)                     \
225
+                             : "r" (reg[base].I),               \
226
+                               "r" (value),                     \
227
+                               "r" (C_FLAG << 29)               \
228
+                             );                                 \
229
+                reg[dest].I = Result;                           \
230
+                Z_FLAG = (Flags >> 29) & 1;                     \
231
+                N_FLAG = (Flags >> 31) & 1;                     \
232
+                C_FLAG = (Flags >> 25) & 1;                     \
233
+                V_FLAG = (Flags >> 26) & 1;                     \
234
+            }
235
+            #define OP_RSCS \
236
+            {\
237
+                register int Flags;                             \
238
+                register int Result;                            \
239
+                asm volatile("mtspr xer, %4\n"                  \
240
+                             "subfeo. %0, %2, %3\n"             \
241
+                             "mcrxr cr1\n"                      \
242
+                             "mfcr      %1\n"                   \
243
+                             : "=r" (Result),                   \
244
+                               "=r" (Flags)                     \
245
+                             : "r" (reg[base].I),               \
246
+                               "r" (value),                     \
247
+                               "r" (C_FLAG << 29)               \
248
+                             );                                 \
249
+                reg[dest].I = Result;                           \
250
+                Z_FLAG = (Flags >> 29) & 1;                     \
251
+                N_FLAG = (Flags >> 31) & 1;                     \
252
+                C_FLAG = (Flags >> 25) & 1;                     \
253
+                V_FLAG = (Flags >> 26) & 1;                     \
254
+            }
255
+            #define OP_CMP \
256
+            {\
257
+                register int Flags;                             \
258
+                register int Result;                            \
259
+                asm volatile("subco. %0, %2, %3\n"              \
260
+                            "mcrxr cr1\n"                       \
261
+                            "mfcr %1\n"                         \
262
+                            : "=r" (Result),                    \
263
+                              "=r" (Flags)                      \
264
+                            : "r" (reg[base].I),                \
265
+                              "r" (value)                       \
266
+                            );                                  \
267
+                Z_FLAG = (Flags >> 29) & 1;                     \
268
+                N_FLAG = (Flags >> 31) & 1;                     \
269
+                C_FLAG = (Flags >> 25) & 1;                     \
270
+                V_FLAG = (Flags >> 26) & 1;                     \
271
+            }
272
+            #define OP_CMN \
273
+            {\
274
+                register int Flags;                             \
275
+                register int Result;                            \
276
+                asm volatile("addco. %0, %2, %3\n"              \
277
+                            "mcrxr cr1\n"                       \
278
+                            "mfcr %1\n"                         \
279
+                            : "=r" (Result),                    \
280
+                              "=r" (Flags)                      \
281
+                            : "r" (reg[base].I),                \
282
+                              "r" (value)                       \
283
+                            );                                  \
284
+                Z_FLAG = (Flags >> 29) & 1;                     \
285
+                N_FLAG = (Flags >> 31) & 1;                     \
286
+                C_FLAG = (Flags >> 25) & 1;                     \
287
+                V_FLAG = (Flags >> 26) & 1;                     \
288
+            }
289
+
290
+#else  // !__POWERPC__
291
+
292
+// Macros to emit instructions in the format used by the particular compiler.
293
+// We use GNU assembler syntax: "op src, dest" rather than "op dest, src"
294
+
295
+#ifdef __GNUC__
296
+ #define ALU_HEADER           asm("mov %%ecx, %%edi; "
297
+ #define ALU_TRAILER          : "=D" (opcode) : "c" (opcode) : "eax", "ebx", "edx", "esi")
298
+ #define EMIT0(op)            #op"; "
299
+ #define EMIT1(op,arg)        #op" "arg"; "
300
+ #define EMIT2(op,src,dest)   #op" "src", "dest"; "
301
+ #define KONST(val)           "$"#val
302
+ #define ASMVAR(cvar)         ASMVAR2 (__USER_LABEL_PREFIX__, cvar)
303
+ #define ASMVAR2(prefix,cvar) STRING (prefix) cvar
304
+ #define STRING(x)            #x
305
+ #define VAR(var)             ASMVAR(#var)
306
+ #define VARL(var)            ASMVAR(#var)
307
+ #define REGREF1(index)       ASMVAR("reg("index")")
308
+ #define REGREF2(index,scale) ASMVAR("reg(,"index","#scale")")
309
+ #define LABEL(n)             #n": "
310
+ #define LABELREF(n,dir)      #n#dir
311
+ #define al "%%al"
312
+ #define ah "%%ah"
313
+ #define eax "%%eax"
314
+ #define bl "%%bl"
315
+ #define bh "%%bh"
316
+ #define ebx "%%ebx"
317
+ #define cl "%%cl"
318
+ #define ch "%%ch"
319
+ #define ecx "%%ecx"
320
+ #define dl "%%dl"
321
+ #define dh "%%dh"
322
+ #define edx "%%edx"
323
+ #define esp "%%esp"
324
+ #define ebp "%%ebp"
325
+ #define esi "%%esi"
326
+ #define edi "%%edi"
327
+ #define movzx movzb
328
+#else
329
+ #define ALU_HEADER           __asm { __asm mov ecx, opcode
330
+ #define ALU_TRAILER          }
331
+ #define EMIT0(op)            __asm op
332
+ #define EMIT1(op,arg)        __asm op arg
333
+ #define EMIT2(op,src,dest)   __asm op dest, src
334
+ #define KONST(val)           val
335
+ #define VAR(var)             var
336
+ #define VARL(var)            dword ptr var
337
+ #define REGREF1(index)       reg[index]
338
+ #define REGREF2(index,scale) reg[index*scale]
339
+ #define LABEL(n)             __asm l##n:
340
+ #define LABELREF(n,dir)      l##n
341
+#endif
342
+
343
+//X//#ifndef _MSC_VER
344
+// ALU op register usage:
345
+//    EAX -> 2nd operand value, result (RSB/RSC)
346
+//    EBX -> C_OUT (carry flag from shift/rotate)
347
+//    ECX -> opcode (input), shift/rotate count
348
+//    EDX -> Rn (base) value, result (all except RSB/RSC)
349
+//    ESI -> Rd (destination) index * 4
350
+
351
+// Helper macros for loading value / shift count
352
+#define VALUE_LOAD_IMM \
353
+        EMIT2(and, KONST(0x0F), eax)            \
354
+        EMIT2(mov, REGREF2(eax,4), eax)         \
355
+        EMIT2(shr, KONST(7), ecx)               \
356
+        EMIT2(and, KONST(0x1F), ecx)
357
+#define VALUE_LOAD_REG \
358
+        EMIT2(and, KONST(0x0F), eax)            \
359
+        EMIT2(mov, REGREF2(eax,4), eax)         \
360
+        EMIT2(movzx, ch, ecx)                   \
361
+        EMIT2(and, KONST(0x0F), ecx)            \
362
+        EMIT2(mov, REGREF2(ecx,4), ecx)
363
+
364
+// Helper macros for setting flags
365
+#define SETCOND_LOGICAL \
366
+    EMIT1(sets, VAR(N_FLAG))            \
367
+    EMIT1(setz, VAR(Z_FLAG))            \
368
+    EMIT2(mov, bl, VAR(C_FLAG))
369
+#define SETCOND_ADD \
370
+    EMIT1(sets, VAR(N_FLAG))            \
371
+    EMIT1(setz, VAR(Z_FLAG))            \
372
+    EMIT1(seto, VAR(V_FLAG))            \
373
+    EMIT1(setc, VAR(C_FLAG))
374
+#define SETCOND_SUB \
375
+    EMIT1(sets, VAR(N_FLAG))            \
376
+    EMIT1(setz, VAR(Z_FLAG))            \
377
+    EMIT1(seto, VAR(V_FLAG))            \
378
+    EMIT1(setnc, VAR(C_FLAG))
379
+
380
+// ALU initialization
381
+#define ALU_INIT(LOAD_C_FLAG) \
382
+    ALU_HEADER                          \
383
+    LOAD_C_FLAG                         \
384
+    EMIT2(mov, ecx, edx)                \
385
+    EMIT2(shr, KONST(14), edx)          \
386
+    EMIT2(mov, ecx, eax)                \
387
+    EMIT2(mov, ecx, esi)                \
388
+    EMIT2(shr, KONST(10), esi)          \
389
+    EMIT2(and, KONST(0x3C), edx)        \
390
+    EMIT2(mov, REGREF1(edx), edx)       \
391
+    EMIT2(and, KONST(0x3C), esi)
392
+
393
+#define LOAD_C_FLAG_YES EMIT2(mov, VAR(C_FLAG), bl)
394
+#define LOAD_C_FLAG_NO  /*nothing*/
395
+#define ALU_INIT_C ALU_INIT(LOAD_C_FLAG_YES)
396
+#define ALU_INIT_NC ALU_INIT(LOAD_C_FLAG_NO)
397
+
398
+// Macros to load the value operand for an ALU op; these all set N/Z
399
+// according to the value
400
+
401
+// OP Rd,Rb,Rm LSL #
402
+#define VALUE_LSL_IMM_C \
403
+    VALUE_LOAD_IMM                      \
404
+    EMIT1(jnz, LABELREF(1,f))           \
405
+    EMIT1(jmp, LABELREF(0,f))           \
406
+    LABEL(1)                            \
407
+    EMIT2(shl, cl, eax)                 \
408
+    EMIT1(setc, bl)                     \
409
+    LABEL(0)
410
+#define VALUE_LSL_IMM_NC \
411
+    VALUE_LOAD_IMM                      \
412
+    EMIT2(shl, cl, eax)
413
+
414
+// OP Rd,Rb,Rm LSL Rs
415
+#define VALUE_LSL_REG_C \
416
+    VALUE_LOAD_REG                      \
417
+    EMIT2(test, cl, cl)                 \
418
+    EMIT1(jz, LABELREF(0,f))            \
419
+    EMIT2(cmp, KONST(0x20), cl)         \
420
+    EMIT1(je, LABELREF(1,f))            \
421
+    EMIT1(ja, LABELREF(2,f))            \
422
+    EMIT2(shl, cl, eax)                 \
423
+    EMIT1(setc, bl)                     \
424
+    EMIT1(jmp, LABELREF(0,f))           \
425
+    LABEL(1)                            \
426
+    EMIT2(test, KONST(1), al)           \
427
+    EMIT1(setnz, bl)                    \
428
+    EMIT2(xor, eax, eax)                \
429
+    EMIT1(jmp, LABELREF(0,f))           \
430
+    LABEL(2)                            \
431
+    EMIT2(xor, ebx, ebx)                \
432
+    EMIT2(xor, eax, eax)                \
433
+    LABEL(0)
434
+#define VALUE_LSL_REG_NC \
435
+    VALUE_LOAD_REG                      \
436
+    EMIT2(cmp, KONST(0x20), cl)         \
437
+    EMIT1(jae, LABELREF(1,f))           \
438
+    EMIT2(shl, cl, eax)                 \
439
+    EMIT1(jmp, LABELREF(0,f))           \
440
+    LABEL(1)                            \
441
+    EMIT2(xor, eax, eax)                \
442
+    LABEL(0)
443
+
444
+// OP Rd,Rb,Rm LSR #
445
+#define VALUE_LSR_IMM_C \
446
+    VALUE_LOAD_IMM                      \
447
+    EMIT1(jz, LABELREF(1,f))            \
448
+    EMIT2(shr, cl, eax)                 \
449
+    EMIT1(setc, bl)                     \
450
+    EMIT1(jmp, LABELREF(0,f))           \
451
+    LABEL(1)                            \
452
+    EMIT2(test, eax, eax)               \
453
+    EMIT1(sets, bl)                     \
454
+    EMIT2(xor, eax, eax)                \
455
+    LABEL(0)
456
+#define VALUE_LSR_IMM_NC \
457
+    VALUE_LOAD_IMM                      \
458
+    EMIT1(jz, LABELREF(1,f))            \
459
+    EMIT2(shr, cl, eax)                 \
460
+    EMIT1(jmp, LABELREF(0,f))           \
461
+    LABEL(1)                            \
462
+    EMIT2(xor, eax, eax)                \
463
+    LABEL(0)
464
+
465
+// OP Rd,Rb,Rm LSR Rs
466
+#define VALUE_LSR_REG_C \
467
+    VALUE_LOAD_REG                      \
468
+    EMIT2(test, cl, cl)                 \
469
+    EMIT1(jz, LABELREF(0,f))            \
470
+    EMIT2(cmp, KONST(0x20), cl)         \
471
+    EMIT1(je, LABELREF(1,f))            \
472
+    EMIT1(ja, LABELREF(2,f))            \
473
+    EMIT2(shr, cl, eax)                 \
474
+    EMIT1(setc, bl)                     \
475
+    EMIT1(jmp, LABELREF(0,f))           \
476
+    LABEL(1)                            \
477
+    EMIT2(test, eax, eax)               \
478
+    EMIT1(sets, bl)                     \
479
+    EMIT2(xor, eax, eax)                \
480
+    EMIT1(jmp, LABELREF(0,f))           \
481
+    LABEL(2)                            \
482
+    EMIT2(xor, ebx, ebx)                \
483
+    EMIT2(xor, eax, eax)                \
484
+    LABEL(0)
485
+#define VALUE_LSR_REG_NC \
486
+    VALUE_LOAD_REG                      \
487
+    EMIT2(cmp, KONST(0x20), cl)         \
488
+    EMIT1(jae, LABELREF(1,f))           \
489
+    EMIT2(shr, cl, eax)                 \
490
+    EMIT1(jmp, LABELREF(0,f))           \
491
+    LABEL(1)                            \
492
+    EMIT2(xor, eax, eax)                \
493
+    LABEL(0)
494
+
495
+// OP Rd,Rb,Rm ASR #
496
+#define VALUE_ASR_IMM_C \
497
+    VALUE_LOAD_IMM                      \
498
+    EMIT1(jz, LABELREF(1,f))            \
499
+    EMIT2(sar, cl, eax)                 \
500
+    EMIT1(setc, bl)                     \
501
+    EMIT1(jmp, LABELREF(0,f))           \
502
+    LABEL(1)                            \
503
+    EMIT2(sar, KONST(31), eax)          \
504
+    EMIT1(sets, bl)                     \
505
+    LABEL(0)
506
+#define VALUE_ASR_IMM_NC \
507
+    VALUE_LOAD_IMM                      \
508
+    EMIT1(jz, LABELREF(1,f))            \
509
+    EMIT2(sar, cl, eax)                 \
510
+    EMIT1(jmp, LABELREF(0,f))           \
511
+    LABEL(1)                            \
512
+    EMIT2(sar, KONST(31), eax)          \
513
+    LABEL(0)
514
+
515
+// OP Rd,Rb,Rm ASR Rs
516
+#define VALUE_ASR_REG_C \
517
+    VALUE_LOAD_REG                      \
518
+    EMIT2(test, cl, cl)                 \
519
+    EMIT1(jz, LABELREF(0,f))            \
520
+    EMIT2(cmp, KONST(0x20), cl)         \
521
+    EMIT1(jae, LABELREF(1,f))           \
522
+    EMIT2(sar, cl, eax)                 \
523
+    EMIT1(setc, bl)                     \
524
+    EMIT1(jmp, LABELREF(0,f))           \
525
+    LABEL(1)                            \
526
+    EMIT2(sar, KONST(31), eax)          \
527
+    EMIT1(sets, bl)                     \
528
+    LABEL(0)
529
+#define VALUE_ASR_REG_NC \
530
+    VALUE_LOAD_REG                      \
531
+    EMIT2(cmp, KONST(0x20), cl)         \
532
+    EMIT1(jae, LABELREF(1,f))           \
533
+    EMIT2(sar, cl, eax)                 \
534
+    EMIT1(jmp, LABELREF(0,f))           \
535
+    LABEL(1)                            \
536
+    EMIT2(sar, KONST(31), eax)          \
537
+    LABEL(0)
538
+
539
+// OP Rd,Rb,Rm ROR #
540
+#define VALUE_ROR_IMM_C \
541
+    VALUE_LOAD_IMM                      \
542
+    EMIT1(jz, LABELREF(1,f))            \
543
+    EMIT2(ror, cl, eax)                 \
544
+    EMIT1(jmp, LABELREF(0,f))           \
545
+    LABEL(1)                            \
546
+    EMIT2(bt, KONST(0), ebx)            \
547
+    EMIT2(rcr, KONST(1), eax)           \
548
+    LABEL(0)                            \
549
+    EMIT1(setc, bl)
550
+#define VALUE_ROR_IMM_NC \
551
+    VALUE_LOAD_IMM                      \
552
+    EMIT1(jz, LABELREF(1,f))            \
553
+    EMIT2(ror, cl, eax)                 \
554
+    EMIT1(jmp, LABELREF(0,f))           \
555
+    LABEL(1)                            \
556
+    EMIT2(bt, KONST(0), VARL(C_FLAG))   \
557
+    EMIT2(rcr, KONST(1), eax)           \
558
+    LABEL(0)
559
+
560
+// OP Rd,Rb,Rm ROR Rs
561
+#define VALUE_ROR_REG_C \
562
+    VALUE_LOAD_REG                      \
563
+    EMIT2(bt, KONST(0), ebx)            \
564
+    EMIT2(ror, cl, eax)                 \
565
+    EMIT1(setc, bl)
566
+#define VALUE_ROR_REG_NC \
567
+    VALUE_LOAD_REG                      \
568
+    EMIT2(ror, cl, eax)
569
+
570
+// OP Rd,Rb,# ROR #
571
+#define VALUE_IMM_C \
572
+    EMIT2(movzx, ch, ecx)               \
573
+    EMIT2(add, ecx, ecx)                \
574
+    EMIT2(movzx, al, eax)               \
575
+    EMIT2(bt, KONST(0), ebx)            \
576
+    EMIT2(ror, cl, eax)                 \
577
+    EMIT1(setc, bl)
578
+#define VALUE_IMM_NC \
579
+    EMIT2(movzx, ch, ecx)               \
580
+    EMIT2(add, ecx, ecx)                \
581
+    EMIT2(movzx, al, eax)               \
582
+    EMIT2(ror, cl, eax)
583
+
584
+// Macros to perform ALU ops
585
+
586
+// Set condition codes iff the destination register is not R15 (PC)
587
+#define CHECK_PC(OP, SETCOND) \
588
+    EMIT2(cmp, KONST(0x3C), esi)        \
589
+    EMIT1(je, LABELREF(8,f))            \
590
+    OP SETCOND                          \
591
+    EMIT1(jmp, LABELREF(9,f))           \
592
+    LABEL(8)                            \
593
+    OP                                  \
594
+    LABEL(9)
595
+
596
+#define OP_AND \
597
+    EMIT2(and, eax, edx)                \
598
+    EMIT2(mov, edx, REGREF1(esi))
599
+#define OP_ANDS   CHECK_PC(OP_AND, SETCOND_LOGICAL)
600
+#define OP_EOR \
601
+    EMIT2(xor, eax, edx)                \
602
+    EMIT2(mov, edx, REGREF1(esi))
603
+#define OP_EORS   CHECK_PC(OP_EOR, SETCOND_LOGICAL)
604
+#define OP_SUB \
605
+    EMIT2(sub, eax, edx)                \
606
+    EMIT2(mov, edx, REGREF1(esi))
607
+#define OP_SUBS   CHECK_PC(OP_SUB, SETCOND_SUB)
608
+#define OP_RSB \
609
+    EMIT2(sub, edx, eax)                \
610
+    EMIT2(mov, eax, REGREF1(esi))
611
+#define OP_RSBS   CHECK_PC(OP_RSB, SETCOND_SUB)
612
+#define OP_ADD \
613
+    EMIT2(add, eax, edx)                \
614
+    EMIT2(mov, edx, REGREF1(esi))
615
+#define OP_ADDS   CHECK_PC(OP_ADD, SETCOND_ADD)
616
+#define OP_ADC \
617
+    EMIT2(bt, KONST(0), VARL(C_FLAG))   \
618
+    EMIT2(adc, eax, edx)                \
619
+    EMIT2(mov, edx, REGREF1(esi))
620
+#define OP_ADCS   CHECK_PC(OP_ADC, SETCOND_ADD)
621
+#define OP_SBC \
622
+    EMIT2(bt, KONST(0), VARL(C_FLAG))   \
623
+    EMIT0(cmc)                          \
624
+    EMIT2(sbb, eax, edx)                \
625
+    EMIT2(mov, edx, REGREF1(esi))
626
+#define OP_SBCS   CHECK_PC(OP_SBC, SETCOND_SUB)
627
+#define OP_RSC \
628
+    EMIT2(bt, KONST(0), VARL(C_FLAG))   \
629
+    EMIT0(cmc)                          \
630
+    EMIT2(sbb, edx, eax)                \
631
+    EMIT2(mov, eax, REGREF1(esi))
632
+#define OP_RSCS   CHECK_PC(OP_RSC, SETCOND_SUB)
633
+#define OP_TST \
634
+    EMIT2(and, eax, edx)                \
635
+    SETCOND_LOGICAL
636
+#define OP_TEQ \
637
+    EMIT2(xor, eax, edx)                \
638
+    SETCOND_LOGICAL
639
+#define OP_CMP \
640
+    EMIT2(sub, eax, edx)                \
641
+    SETCOND_SUB
642
+#define OP_CMN \
643
+    EMIT2(add, eax, edx)                \
644
+    SETCOND_ADD
645
+#define OP_ORR \
646
+    EMIT2(or, eax, edx)                 \
647
+    EMIT2(mov, edx, REGREF1(esi))
648
+#define OP_ORRS   CHECK_PC(OP_ORR, SETCOND_LOGICAL)
649
+#define OP_MOV \
650
+    EMIT2(mov, eax, REGREF1(esi))
651
+#define OP_MOVS   CHECK_PC(EMIT2(test,eax,eax) EMIT2(mov,eax,REGREF1(esi)), SETCOND_LOGICAL)
652
+#define OP_BIC \
653
+    EMIT1(not, eax)                     \
654
+    EMIT2(and, eax, edx)                \
655
+    EMIT2(mov, edx, REGREF1(esi))
656
+#define OP_BICS   CHECK_PC(OP_BIC, SETCOND_LOGICAL)
657
+#define OP_MVN \
658
+    EMIT1(not, eax)                     \
659
+    EMIT2(mov, eax, REGREF1(esi))
660
+#define OP_MVNS   CHECK_PC(OP_MVN EMIT2(test,eax,eax), SETCOND_LOGICAL)
661
+
662
+// ALU cleanup macro
663
+#define ALU_FINISH  ALU_TRAILER
664
+
665
+// End of ALU macros
666
+//X//#endif //_MSC_VER
667
+
668
+#ifdef __GNUC__
669
+
670
+#define ROR_IMM_MSR \
671
+    asm ("ror %%cl, %%eax;"             \
672
+         : "=a" (value)                 \
673
+         : "a" (opcode & 0xFF), "c" (shift));
674
+
675
+#define ROR_OFFSET \
676
+    asm("ror %%cl, %0"                  \
677
+        : "=r" (offset)                 \
678
+        : "0" (offset), "c" (shift));
679
+
680
+#define RRX_OFFSET \
681
+    asm(EMIT2(btl,KONST(0),VAR(C_FLAG)) \
682
+        "rcr $1, %0"                    \
683
+        : "=r" (offset)                 \
684
+        : "0" (offset));
685
+
686
+#else  // !__GNUC__, i.e. Visual C++
687
+
688
+#define ROR_IMM_MSR \
689
+    __asm {                             \
690
+        __asm mov ecx, shift            \
691
+        __asm ror value, cl             \
692
+     }
693
+
694
+
695
+#define ROR_OFFSET \
696
+    __asm {                             \
697
+        __asm mov ecx, shift            \
698
+        __asm ror offset, cl            \
699
+    }
700
+
701
+#define RRX_OFFSET \
702
+    __asm {                             \
703
+        __asm bt dword ptr C_FLAG, 0    \
704
+        __asm rcr offset, 1             \
705
+    }
706
+
707
+#endif  // !__GNUC__
708
+
709
+#endif  // !__POWERPC__
710
+#endif  // !C_CORE
711
+
712
+// C core
713
+
714
+#define C_SETCOND_LOGICAL \
715
+    N_FLAG = ((s32)res < 0) ? true : false;             \
716
+    Z_FLAG = (res == 0) ? true : false;                 \
717
+    C_FLAG = C_OUT;
718
+#define C_SETCOND_ADD \
719
+    N_FLAG = ((s32)res < 0) ? true : false;             \
720
+    Z_FLAG = (res == 0) ? true : false;                 \
721
+    V_FLAG = ((NEG(lhs) & NEG(rhs) & POS(res)) |        \
722
+              (POS(lhs) & POS(rhs) & NEG(res))) ? true : false;\
723
+    C_FLAG = ((NEG(lhs) & NEG(rhs)) |                   \
724
+              (NEG(lhs) & POS(res)) |                   \
725
+              (NEG(rhs) & POS(res))) ? true : false;
726
+#define C_SETCOND_SUB \
727
+    N_FLAG = ((s32)res < 0) ? true : false;             \
728
+    Z_FLAG = (res == 0) ? true : false;                 \
729
+    V_FLAG = ((NEG(lhs) & POS(rhs) & POS(res)) |        \
730
+              (POS(lhs) & NEG(rhs) & NEG(res))) ? true : false;\
731
+    C_FLAG = ((NEG(lhs) & POS(rhs)) |                   \
732
+              (NEG(lhs) & POS(res)) |                   \
733
+              (POS(rhs) & POS(res))) ? true : false;
734
+
735
+#ifndef ALU_INIT_C
736
+ #define ALU_INIT_C \
737
+    int dest = (opcode>>12) & 15;                       \
738
+    bool C_OUT = C_FLAG;                                \
739
+    u32 value;
740
+#endif
741
+// OP Rd,Rb,Rm LSL #
742
+#ifndef VALUE_LSL_IMM_C
743
+ #define VALUE_LSL_IMM_C \
744
+    unsigned int shift = (opcode >> 7) & 0x1F;          \
745
+    if (LIKELY(!shift)) {  /* LSL #0 most common? */    \
746
+        value = reg[opcode & 0x0F].I;                   \
747
+    } else {                                            \
748
+        u32 v = reg[opcode & 0x0F].I;                   \
749
+        C_OUT = (v >> (32 - shift)) & 1 ? true : false; \
750
+        value = v << shift;                             \
751
+    }
752
+#endif
753
+// OP Rd,Rb,Rm LSL Rs
754
+#ifndef VALUE_LSL_REG_C
755
+ #define VALUE_LSL_REG_C \
756
+    unsigned int shift = reg[(opcode >> 8)&15].B.B0;    \
757
+    if (LIKELY(shift)) {                                \
758
+        if (shift == 32) {                              \
759
+            value = 0;                                  \
760
+            C_OUT = (reg[opcode & 0x0F].I & 1 ? true : false);\
761
+        } else if (LIKELY(shift < 32)) {                \
762
+            u32 v = reg[opcode & 0x0F].I;               \
763
+            C_OUT = (v >> (32 - shift)) & 1 ? true : false;\
764
+            value = v << shift;                         \
765
+        } else {                                        \
766
+            value = 0;                                  \
767
+            C_OUT = false;                              \
768
+        }                                               \
769
+    } else {                                            \
770
+        value = reg[opcode & 0x0F].I;                   \
771
+    }
772
+#endif
773
+// OP Rd,Rb,Rm LSR #
774
+#ifndef VALUE_LSR_IMM_C
775
+ #define VALUE_LSR_IMM_C \
776
+    unsigned int shift = (opcode >> 7) & 0x1F;          \
777
+    if (LIKELY(shift)) {                                \
778
+        u32 v = reg[opcode & 0x0F].I;                   \
779
+        C_OUT = (v >> (shift - 1)) & 1 ? true : false;  \
780
+        value = v >> shift;                             \
781
+    } else {                                            \
782
+        value = 0;                                      \
783
+        C_OUT = (reg[opcode & 0x0F].I & 0x80000000) ? true : false;\
784
+    }
785
+#endif
786
+// OP Rd,Rb,Rm LSR Rs
787
+#ifndef VALUE_LSR_REG_C
788
+ #define VALUE_LSR_REG_C \
789
+    unsigned int shift = reg[(opcode >> 8)&15].B.B0;    \
790
+    if (LIKELY(shift)) {                                \
791
+        if (shift == 32) {                              \
792
+            value = 0;                                  \
793
+            C_OUT = (reg[opcode & 0x0F].I & 0x80000000 ? true : false);\
794
+        } else if (LIKELY(shift < 32)) {                \
795
+            u32 v = reg[opcode & 0x0F].I;               \
796
+            C_OUT = (v >> (shift - 1)) & 1 ? true : false;\
797
+            value = v >> shift;                         \
798
+        } else {                                        \
799
+            value = 0;                                  \
800
+            C_OUT = false;                              \
801
+        }                                               \
802
+    } else {                                            \
803
+        value = reg[opcode & 0x0F].I;                   \
804
+    }
805
+#endif
806
+// OP Rd,Rb,Rm ASR #
807
+#ifndef VALUE_ASR_IMM_C
808
+ #define VALUE_ASR_IMM_C \
809
+    unsigned int shift = (opcode >> 7) & 0x1F;          \
810
+    if (LIKELY(shift)) {                                \
811
+        /* VC++ BUG: u32 v; (s32)v>>n is optimized to shr! */ \
812
+        s32 v = reg[opcode & 0x0F].I;                   \
813
+        C_OUT = (v >> (int)(shift - 1)) & 1 ? true : false;\
814
+        value = v >> (int)shift;                        \
815
+    } else {                                            \
816
+        if (reg[opcode & 0x0F].I & 0x80000000) {        \
817
+            value = 0xFFFFFFFF;                         \
818
+            C_OUT = true;                               \
819
+        } else {                                        \
820
+            value = 0;                                  \
821
+            C_OUT = false;                              \
822
+        }                                               \
823
+    }
824
+#endif
825
+// OP Rd,Rb,Rm ASR Rs
826
+#ifndef VALUE_ASR_REG_C
827
+ #define VALUE_ASR_REG_C \
828
+    unsigned int shift = reg[(opcode >> 8)&15].B.B0;    \
829
+    if (LIKELY(shift < 32)) {                           \
830
+        if (LIKELY(shift)) {                            \
831
+            s32 v = reg[opcode & 0x0F].I;               \
832
+            C_OUT = (v >> (int)(shift - 1)) & 1 ? true : false;\
833
+            value = v >> (int)shift;                    \
834
+        } else {                                        \
835
+            value = reg[opcode & 0x0F].I;               \
836
+        }                                               \
837
+    } else {                                            \
838
+        if (reg[opcode & 0x0F].I & 0x80000000) {        \
839
+            value = 0xFFFFFFFF;                         \
840
+            C_OUT = true;                               \
841
+        } else {                                        \
842
+            value = 0;                                  \
843
+            C_OUT = false;                              \
844
+        }                                               \
845
+    }
846
+#endif
847
+// OP Rd,Rb,Rm ROR #
848
+#ifndef VALUE_ROR_IMM_C
849
+ #define VALUE_ROR_IMM_C \
850
+    unsigned int shift = (opcode >> 7) & 0x1F;          \
851
+    if (LIKELY(shift)) {                                \
852
+        u32 v = reg[opcode & 0x0F].I;                   \
853
+        C_OUT = (v >> (shift - 1)) & 1 ? true : false;  \
854
+        value = ((v << (32 - shift)) |                  \
855
+                 (v >> shift));                         \
856
+    } else {                                            \
857
+        u32 v = reg[opcode & 0x0F].I;                   \
858
+        C_OUT = (v & 1) ? true : false;                 \
859
+        value = ((v >> 1) |                             \
860
+                 (C_FLAG << 31));                       \
861
+    }
862
+#endif
863
+// OP Rd,Rb,Rm ROR Rs
864
+#ifndef VALUE_ROR_REG_C
865
+ #define VALUE_ROR_REG_C \
866
+    unsigned int shift = reg[(opcode >> 8)&15].B.B0;    \
867
+    if (LIKELY(shift & 0x1F)) {                         \
868
+        u32 v = reg[opcode & 0x0F].I;                   \
869
+        C_OUT = (v >> (shift - 1)) & 1 ? true : false;  \
870
+        value = ((v << (32 - shift)) |                  \
871
+                 (v >> shift));                         \
872
+    } else {                                            \
873
+        value = reg[opcode & 0x0F].I;                   \
874
+        if (shift)                                      \
875
+            C_OUT = (value & 0x80000000 ? true : false);\
876
+    }
877
+#endif
878
+// OP Rd,Rb,# ROR #
879
+#ifndef VALUE_IMM_C
880
+ #define VALUE_IMM_C \
881
+    int shift = (opcode & 0xF00) >> 7;                  \
882
+    if (UNLIKELY(shift)) {                              \
883
+        u32 v = opcode & 0xFF;                          \
884
+        C_OUT = (v >> (shift - 1)) & 1 ? true : false;  \
885
+        value = ((v << (32 - shift)) |                  \
886
+                 (v >> shift));                         \
887
+    } else {                                            \
888
+        value = opcode & 0xFF;                          \
889
+    }
890
+#endif
891
+
892
+// Make the non-carry versions default to the carry versions
893
+// (this is fine for C--the compiler will optimize the dead code out)
894
+#ifndef ALU_INIT_NC
895
+ #define ALU_INIT_NC ALU_INIT_C
896
+#endif
897
+#ifndef VALUE_LSL_IMM_NC
898
+ #define VALUE_LSL_IMM_NC VALUE_LSL_IMM_C
899
+#endif
900
+#ifndef VALUE_LSL_REG_NC
901
+ #define VALUE_LSL_REG_NC VALUE_LSL_REG_C
902
+#endif
903
+#ifndef VALUE_LSR_IMM_NC
904
+ #define VALUE_LSR_IMM_NC VALUE_LSR_IMM_C
905
+#endif
906
+#ifndef VALUE_LSR_REG_NC
907
+ #define VALUE_LSR_REG_NC VALUE_LSR_REG_C
908
+#endif
909
+#ifndef VALUE_ASR_IMM_NC
910
+ #define VALUE_ASR_IMM_NC VALUE_ASR_IMM_C
911
+#endif
912
+#ifndef VALUE_ASR_REG_NC
913
+ #define VALUE_ASR_REG_NC VALUE_ASR_REG_C
914
+#endif
915
+#ifndef VALUE_ROR_IMM_NC
916
+ #define VALUE_ROR_IMM_NC VALUE_ROR_IMM_C
917
+#endif
918
+#ifndef VALUE_ROR_REG_NC
919
+ #define VALUE_ROR_REG_NC VALUE_ROR_REG_C
920
+#endif
921
+#ifndef VALUE_IMM_NC
922
+ #define VALUE_IMM_NC VALUE_IMM_C
923
+#endif
924
+
925
+#define C_CHECK_PC(SETCOND) if (LIKELY(dest != 15)) { SETCOND }
926
+#ifndef OP_AND
927
+ #define OP_AND \
928
+    u32 res = reg[(opcode>>16)&15].I & value;           \
929
+    reg[dest].I = res;
930
+#endif
931
+#ifndef OP_ANDS
932
+ #define OP_ANDS   OP_AND C_CHECK_PC(C_SETCOND_LOGICAL)
933
+#endif
934
+#ifndef OP_EOR
935
+ #define OP_EOR \
936
+    u32 res = reg[(opcode>>16)&15].I ^ value;           \
937
+    reg[dest].I = res;
938
+#endif
939
+#ifndef OP_EORS
940
+ #define OP_EORS   OP_EOR C_CHECK_PC(C_SETCOND_LOGICAL)
941
+#endif
942
+#ifndef OP_SUB
943
+ #define OP_SUB \
944
+    u32 lhs = reg[(opcode>>16)&15].I;                   \
945
+    u32 rhs = value;                                    \
946
+    u32 res = lhs - rhs;                                \
947
+    reg[dest].I = res;
948
+#endif
949
+#ifndef OP_SUBS
950
+ #define OP_SUBS   OP_SUB C_CHECK_PC(C_SETCOND_SUB)
951
+#endif
952
+#ifndef OP_RSB
953
+ #define OP_RSB \
954
+    u32 lhs = reg[(opcode>>16)&15].I;                   \
955
+    u32 rhs = value;                                    \
956
+    u32 res = rhs - lhs;                                \
957
+    reg[dest].I = res;
958
+#endif
959
+#ifndef OP_RSBS
960
+ #define OP_RSBS   OP_RSB C_CHECK_PC(C_SETCOND_SUB)
961
+#endif
962
+#ifndef OP_ADD
963
+ #define OP_ADD \
964
+    u32 lhs = reg[(opcode>>16)&15].I;                   \
965
+    u32 rhs = value;                                    \
966
+    u32 res = lhs + rhs;                                \
967
+    reg[dest].I = res;
968
+#endif
969
+#ifndef OP_ADDS
970
+ #define OP_ADDS   OP_ADD C_CHECK_PC(C_SETCOND_ADD)
971
+#endif
972
+#ifndef OP_ADC
973
+ #define OP_ADC \
974
+    u32 lhs = reg[(opcode>>16)&15].I;                   \
975
+    u32 rhs = value;                                    \
976
+    u32 res = lhs + rhs + (u32)C_FLAG;                  \
977
+    reg[dest].I = res;
978
+#endif
979
+#ifndef OP_ADCS
980
+ #define OP_ADCS   OP_ADC C_CHECK_PC(C_SETCOND_ADD)
981
+#endif
982
+#ifndef OP_SBC
983
+ #define OP_SBC \
984
+    u32 lhs = reg[(opcode>>16)&15].I;                   \
985
+    u32 rhs = value;                                    \
986
+    u32 res = lhs - rhs - !((u32)C_FLAG);               \
987
+    reg[dest].I = res;
988
+#endif
989
+#ifndef OP_SBCS
990
+ #define OP_SBCS   OP_SBC C_CHECK_PC(C_SETCOND_SUB)
991
+#endif
992
+#ifndef OP_RSC
993
+ #define OP_RSC \
994
+    u32 lhs = reg[(opcode>>16)&15].I;                   \
995
+    u32 rhs = value;                                    \
996
+    u32 res = rhs - lhs - !((u32)C_FLAG);               \
997
+    reg[dest].I = res;
998
+#endif
999
+#ifndef OP_RSCS
1000
+ #define OP_RSCS   OP_RSC C_CHECK_PC(C_SETCOND_SUB)
1001
+#endif
1002
+#ifndef OP_TST
1003
+ #define OP_TST \
1004
+    u32 res = reg[(opcode >> 16) & 0x0F].I & value;     \
1005
+    C_SETCOND_LOGICAL;
1006
+#endif
1007
+#ifndef OP_TEQ
1008
+ #define OP_TEQ \
1009
+    u32 res = reg[(opcode >> 16) & 0x0F].I ^ value;     \
1010
+    C_SETCOND_LOGICAL;
1011
+#endif
1012
+#ifndef OP_CMP
1013
+ #define OP_CMP \
1014
+    u32 lhs = reg[(opcode>>16)&15].I;                   \
1015
+    u32 rhs = value;                                    \
1016
+    u32 res = lhs - rhs;                                \
1017
+    C_SETCOND_SUB;
1018
+#endif
1019
+#ifndef OP_CMN
1020
+ #define OP_CMN \
1021
+    u32 lhs = reg[(opcode>>16)&15].I;                   \
1022
+    u32 rhs = value;                                    \
1023
+    u32 res = lhs + rhs;                                \
1024
+    C_SETCOND_ADD;
1025
+#endif
1026
+#ifndef OP_ORR
1027
+ #define OP_ORR \
1028
+    u32 res = reg[(opcode >> 16) & 0x0F].I | value;     \
1029
+    reg[dest].I = res;
1030
+#endif
1031
+#ifndef OP_ORRS
1032
+ #define OP_ORRS   OP_ORR C_CHECK_PC(C_SETCOND_LOGICAL)
1033
+#endif
1034
+#ifndef OP_MOV
1035
+ #define OP_MOV \
1036
+    u32 res = value;                                    \
1037
+    reg[dest].I = res;
1038
+#endif
1039
+#ifndef OP_MOVS
1040
+ #define OP_MOVS   OP_MOV C_CHECK_PC(C_SETCOND_LOGICAL)
1041
+#endif
1042
+#ifndef OP_BIC
1043
+ #define OP_BIC \
1044
+    u32 res = reg[(opcode >> 16) & 0x0F].I & (~value);  \
1045
+    reg[dest].I = res;
1046
+#endif
1047
+#ifndef OP_BICS
1048
+ #define OP_BICS   OP_BIC C_CHECK_PC(C_SETCOND_LOGICAL)
1049
+#endif
1050
+#ifndef OP_MVN
1051
+ #define OP_MVN \
1052
+    u32 res = ~value;                                   \
1053
+    reg[dest].I = res;
1054
+#endif
1055
+#ifndef OP_MVNS
1056
+ #define OP_MVNS   OP_MVN C_CHECK_PC(C_SETCOND_LOGICAL)
1057
+#endif
1058
+
1059
+#ifndef SETCOND_NONE
1060
+ #define SETCOND_NONE /*nothing*/
1061
+#endif
1062
+#ifndef SETCOND_MUL
1063
+ #define SETCOND_MUL \
1064
+     N_FLAG = ((s32)reg[dest].I < 0) ? true : false;    \
1065
+     Z_FLAG = reg[dest].I ? false : true;
1066
+#endif
1067
+#ifndef SETCOND_MULL
1068
+ #define SETCOND_MULL \
1069
+     N_FLAG = (reg[dest].I & 0x80000000) ? true : false;\
1070
+     Z_FLAG = reg[dest].I || reg[acc].I ? false : true;
1071
+#endif
1072
+
1073
+#ifndef ALU_FINISH
1074
+ #define ALU_FINISH /*nothing*/
1075
+#endif
1076
+
1077
+#ifndef ROR_IMM_MSR
1078
+ #define ROR_IMM_MSR \
1079
+    u32 v = opcode & 0xff;                              \
1080
+    value = ((v << (32 - shift)) | (v >> shift));
1081
+#endif
1082
+#ifndef ROR_OFFSET
1083
+ #define ROR_OFFSET \
1084
+    offset = ((offset << (32 - shift)) | (offset >> shift));
1085
+#endif
1086
+#ifndef RRX_OFFSET
1087
+ #define RRX_OFFSET \
1088
+    offset = ((offset >> 1) | ((int)C_FLAG << 31));
1089
+#endif
1090
+
1091
+// ALU ops (except multiply) //////////////////////////////////////////////
1092
+
1093
+// ALU_INIT: init code (ALU_INIT_C or ALU_INIT_NC)
1094
+// GETVALUE: load value and shift/rotate (VALUE_XXX)
1095
+// OP: ALU operation (OP_XXX)
1096
+// MODECHANGE: MODECHANGE_NO or MODECHANGE_YES
1097
+// ISREGSHIFT: 1 for insns of the form ...,Rn LSL/etc Rs; 0 otherwise
1098
+// ALU_INIT, GETVALUE, OP, and ALU_FINISH are concatenated in order.
1099
+#define ALU_INSN(ALU_INIT, GETVALUE, OP, MODECHANGE, ISREGSHIFT) \
1100
+    ALU_INIT GETVALUE OP ALU_FINISH;                            \
1101
+    if (LIKELY((opcode & 0x0000F000) != 0x0000F000)) {          \
1102
+        clockTicks = 1 + ISREGSHIFT                             \
1103
+                       + codeTicksAccessSeq32(armNextPC);       \
1104
+    } else {                                                    \
1105
+        MODECHANGE;                                             \
1106
+        if (armState) {                                         \
1107
+            reg[15].I &= 0xFFFFFFFC;                            \
1108
+            armNextPC = reg[15].I;                              \
1109
+            reg[15].I += 4;                                     \
1110
+            ARM_PREFETCH;                                       \
1111
+        } else {                                                \
1112
+            reg[15].I &= 0xFFFFFFFE;                            \
1113
+            armNextPC = reg[15].I;                              \
1114
+            reg[15].I += 2;                                     \
1115
+            THUMB_PREFETCH;                                     \
1116
+        }                                                       \
1117
+        clockTicks = 3 + ISREGSHIFT                             \
1118
+                       + codeTicksAccess32(armNextPC)           \
1119
+                       + codeTicksAccessSeq32(armNextPC)        \
1120
+                       + codeTicksAccessSeq32(armNextPC);       \
1121
+    }
1122
+
1123
+#define MODECHANGE_NO  /*nothing*/
1124
+#define MODECHANGE_YES CPUSwitchMode(reg[17].I & 0x1f, false);
1125
+
1126
+#define DEFINE_ALU_INSN_C(CODE1, CODE2, OP, MODECHANGE) \
1127
+  static INSN_REGPARM void arm##CODE1##0(u32 opcode) { ALU_INSN(ALU_INIT_C, VALUE_LSL_IMM_C, OP_##OP, MODECHANGE_##MODECHANGE, 0); }\
1128
+  static INSN_REGPARM void arm##CODE1##1(u32 opcode) { ALU_INSN(ALU_INIT_C, VALUE_LSL_REG_C, OP_##OP, MODECHANGE_##MODECHANGE, 1); }\
1129
+  static INSN_REGPARM void arm##CODE1##2(u32 opcode) { ALU_INSN(ALU_INIT_C, VALUE_LSR_IMM_C, OP_##OP, MODECHANGE_##MODECHANGE, 0); }\
1130
+  static INSN_REGPARM void arm##CODE1##3(u32 opcode) { ALU_INSN(ALU_INIT_C, VALUE_LSR_REG_C, OP_##OP, MODECHANGE_##MODECHANGE, 1); }\
1131
+  static INSN_REGPARM void arm##CODE1##4(u32 opcode) { ALU_INSN(ALU_INIT_C, VALUE_ASR_IMM_C, OP_##OP, MODECHANGE_##MODECHANGE, 0); }\
1132
+  static INSN_REGPARM void arm##CODE1##5(u32 opcode) { ALU_INSN(ALU_INIT_C, VALUE_ASR_REG_C, OP_##OP, MODECHANGE_##MODECHANGE, 1); }\
1133
+  static INSN_REGPARM void arm##CODE1##6(u32 opcode) { ALU_INSN(ALU_INIT_C, VALUE_ROR_IMM_C, OP_##OP, MODECHANGE_##MODECHANGE, 0); }\
1134
+  static INSN_REGPARM void arm##CODE1##7(u32 opcode) { ALU_INSN(ALU_INIT_C, VALUE_ROR_REG_C, OP_##OP, MODECHANGE_##MODECHANGE, 1); }\
1135
+  static INSN_REGPARM void arm##CODE2##0(u32 opcode) { ALU_INSN(ALU_INIT_C, VALUE_IMM_C,     OP_##OP, MODECHANGE_##MODECHANGE, 0); }
1136
+#define DEFINE_ALU_INSN_NC(CODE1, CODE2, OP, MODECHANGE) \
1137
+  static INSN_REGPARM void arm##CODE1##0(u32 opcode) { ALU_INSN(ALU_INIT_NC, VALUE_LSL_IMM_NC, OP_##OP, MODECHANGE_##MODECHANGE, 0); }\
1138
+  static INSN_REGPARM void arm##CODE1##1(u32 opcode) { ALU_INSN(ALU_INIT_NC, VALUE_LSL_REG_NC, OP_##OP, MODECHANGE_##MODECHANGE, 1); }\
1139
+  static INSN_REGPARM void arm##CODE1##2(u32 opcode) { ALU_INSN(ALU_INIT_NC, VALUE_LSR_IMM_NC, OP_##OP, MODECHANGE_##MODECHANGE, 0); }\
1140
+  static INSN_REGPARM void arm##CODE1##3(u32 opcode) { ALU_INSN(ALU_INIT_NC, VALUE_LSR_REG_NC, OP_##OP, MODECHANGE_##MODECHANGE, 1); }\
1141
+  static INSN_REGPARM void arm##CODE1##4(u32 opcode) { ALU_INSN(ALU_INIT_NC, VALUE_ASR_IMM_NC, OP_##OP, MODECHANGE_##MODECHANGE, 0); }\
1142
+  static INSN_REGPARM void arm##CODE1##5(u32 opcode) { ALU_INSN(ALU_INIT_NC, VALUE_ASR_REG_NC, OP_##OP, MODECHANGE_##MODECHANGE, 1); }\
1143
+  static INSN_REGPARM void arm##CODE1##6(u32 opcode) { ALU_INSN(ALU_INIT_NC, VALUE_ROR_IMM_NC, OP_##OP, MODECHANGE_##MODECHANGE, 0); }\
1144
+  static INSN_REGPARM void arm##CODE1##7(u32 opcode) { ALU_INSN(ALU_INIT_NC, VALUE_ROR_REG_NC, OP_##OP, MODECHANGE_##MODECHANGE, 1); }\
1145
+  static INSN_REGPARM void arm##CODE2##0(u32 opcode) { ALU_INSN(ALU_INIT_NC, VALUE_IMM_NC,     OP_##OP, MODECHANGE_##MODECHANGE, 0); }
1146
+
1147
+// AND
1148
+DEFINE_ALU_INSN_NC(00, 20, AND,  NO)
1149
+// ANDS
1150
+DEFINE_ALU_INSN_C (01, 21, ANDS, YES)
1151
+
1152
+// EOR
1153
+DEFINE_ALU_INSN_NC(02, 22, EOR,  NO)
1154
+// EORS
1155
+DEFINE_ALU_INSN_C (03, 23, EORS, YES)
1156
+
1157
+// SUB
1158
+DEFINE_ALU_INSN_NC(04, 24, SUB,  NO)
1159
+// SUBS
1160
+DEFINE_ALU_INSN_NC(05, 25, SUBS, YES)
1161
+
1162
+// RSB
1163
+DEFINE_ALU_INSN_NC(06, 26, RSB,  NO)
1164
+// RSBS
1165
+DEFINE_ALU_INSN_NC(07, 27, RSBS, YES)
1166
+
1167
+// ADD
1168
+DEFINE_ALU_INSN_NC(08, 28, ADD,  NO)
1169
+// ADDS
1170
+DEFINE_ALU_INSN_NC(09, 29, ADDS, YES)
1171
+
1172
+// ADC
1173
+DEFINE_ALU_INSN_NC(0A, 2A, ADC,  NO)
1174
+// ADCS
1175
+DEFINE_ALU_INSN_NC(0B, 2B, ADCS, YES)
1176
+
1177
+// SBC
1178
+DEFINE_ALU_INSN_NC(0C, 2C, SBC,  NO)
1179
+// SBCS
1180
+DEFINE_ALU_INSN_NC(0D, 2D, SBCS, YES)
1181
+
1182
+// RSC
1183
+DEFINE_ALU_INSN_NC(0E, 2E, RSC,  NO)
1184
+// RSCS
1185
+DEFINE_ALU_INSN_NC(0F, 2F, RSCS, YES)
1186
+
1187
+// TST
1188
+DEFINE_ALU_INSN_C (11, 31, TST,  NO)
1189
+
1190
+// TEQ
1191
+DEFINE_ALU_INSN_C (13, 33, TEQ,  NO)
1192
+
1193
+// CMP
1194
+DEFINE_ALU_INSN_NC(15, 35, CMP,  NO)
1195
+
1196
+// CMN
1197
+DEFINE_ALU_INSN_NC(17, 37, CMN,  NO)
1198
+
1199
+// ORR
1200
+DEFINE_ALU_INSN_NC(18, 38, ORR,  NO)
1201
+// ORRS
1202
+DEFINE_ALU_INSN_C (19, 39, ORRS, YES)
1203
+
1204
+// MOV
1205
+DEFINE_ALU_INSN_NC(1A, 3A, MOV,  NO)
1206
+// MOVS
1207
+DEFINE_ALU_INSN_C (1B, 3B, MOVS, YES)
1208
+
1209
+// BIC
1210
+DEFINE_ALU_INSN_NC(1C, 3C, BIC,  NO)
1211
+// BICS
1212
+DEFINE_ALU_INSN_C (1D, 3D, BICS, YES)
1213
+
1214
+// MVN
1215
+DEFINE_ALU_INSN_NC(1E, 3E, MVN,  NO)
1216
+// MVNS
1217
+DEFINE_ALU_INSN_C (1F, 3F, MVNS, YES)
1218
+
1219
+// Multiply instructions //////////////////////////////////////////////////
1220
+
1221
+// OP: OP_MUL, OP_MLA etc.
1222
+// SETCOND: SETCOND_NONE, SETCOND_MUL, or SETCOND_MULL
1223
+// CYCLES: base cycle count (1, 2, or 3)
1224
+#define MUL_INSN(OP, SETCOND, CYCLES) \
1225
+    int mult = (opcode & 0x0F);                         \
1226
+    u32 rs = reg[(opcode >> 8) & 0x0F].I;               \
1227
+    int acc = (opcode >> 12) & 0x0F;   /* or destLo */  \
1228
+    int dest = (opcode >> 16) & 0x0F;  /* or destHi */  \
1229
+    OP;                                                 \
1230
+    SETCOND;                                            \
1231
+    if ((s32)rs < 0)                                    \
1232
+        rs = ~rs;                                       \
1233
+    if ((rs & 0xFFFFFF00) == 0)                         \
1234
+        clockTicks += 0;                                \
1235
+    else if ((rs & 0xFFFF0000) == 0)                    \
1236
+        clockTicks += 1;                                \
1237
+    else if ((rs & 0xFF000000) == 0)                    \
1238
+        clockTicks += 2;                                \
1239
+    else                                                \
1240
+        clockTicks += 3;                                \
1241
+    if (busPrefetchCount == 0)                          \
1242
+        busPrefetchCount = ((busPrefetchCount+1)<<clockTicks) - 1; \
1243
+    clockTicks += 1 + codeTicksAccess32(armNextPC);
1244
+
1245
+#define OP_MUL \
1246
+    reg[dest].I = reg[mult].I * rs;
1247
+#define OP_MLA \
1248
+    reg[dest].I = reg[mult].I * rs + reg[acc].I;
1249
+#define OP_MULL(SIGN) \
1250
+    SIGN##64 res = (SIGN##64)(SIGN##32)reg[mult].I      \
1251
+                 * (SIGN##64)(SIGN##32)rs;              \
1252
+    reg[acc].I = (u32)res;                              \
1253
+    reg[dest].I = (u32)(res >> 32);
1254
+#define OP_MLAL(SIGN) \
1255
+    SIGN##64 res = ((SIGN##64)reg[dest].I<<32 | reg[acc].I)\
1256
+                 + ((SIGN##64)(SIGN##32)reg[mult].I     \
1257
+                    * (SIGN##64)(SIGN##32)rs);          \
1258
+    reg[acc].I = (u32)res;                              \
1259
+    reg[dest].I = (u32)(res >> 32);
1260
+#define OP_UMULL OP_MULL(u)
1261
+#define OP_UMLAL OP_MLAL(u)
1262
+#define OP_SMULL OP_MULL(s)
1263
+#define OP_SMLAL OP_MLAL(s)
1264
+
1265
+// MUL Rd, Rm, Rs
1266
+static INSN_REGPARM void arm009(u32 opcode) { MUL_INSN(OP_MUL, SETCOND_NONE, 1); }
1267
+// MULS Rd, Rm, Rs
1268
+static INSN_REGPARM void arm019(u32 opcode) { MUL_INSN(OP_MUL, SETCOND_MUL, 1); }
1269
+
1270
+// MLA Rd, Rm, Rs, Rn
1271
+static INSN_REGPARM void arm029(u32 opcode) { MUL_INSN(OP_MLA, SETCOND_NONE, 2); }
1272
+// MLAS Rd, Rm, Rs, Rn
1273
+static INSN_REGPARM void arm039(u32 opcode) { MUL_INSN(OP_MLA, SETCOND_MUL, 2); }
1274
+
1275
+// UMULL RdLo, RdHi, Rn, Rs
1276
+static INSN_REGPARM void arm089(u32 opcode) { MUL_INSN(OP_UMULL, SETCOND_NONE, 2); }
1277
+// UMULLS RdLo, RdHi, Rn, Rs
1278
+static INSN_REGPARM void arm099(u32 opcode) { MUL_INSN(OP_UMULL, SETCOND_MULL, 2); }
1279
+
1280
+// UMLAL RdLo, RdHi, Rn, Rs
1281
+static INSN_REGPARM void arm0A9(u32 opcode) { MUL_INSN(OP_UMLAL, SETCOND_NONE, 3); }
1282
+// UMLALS RdLo, RdHi, Rn, Rs
1283
+static INSN_REGPARM void arm0B9(u32 opcode) { MUL_INSN(OP_UMLAL, SETCOND_MULL, 3); }
1284
+
1285
+// SMULL RdLo, RdHi, Rm, Rs
1286
+static INSN_REGPARM void arm0C9(u32 opcode) { MUL_INSN(OP_SMULL, SETCOND_NONE, 2); }
1287
+// SMULLS RdLo, RdHi, Rm, Rs
1288
+static INSN_REGPARM void arm0D9(u32 opcode) { MUL_INSN(OP_SMULL, SETCOND_MULL, 2); }
1289
+
1290
+// SMLAL RdLo, RdHi, Rm, Rs
1291
+static INSN_REGPARM void arm0E9(u32 opcode) { MUL_INSN(OP_SMLAL, SETCOND_NONE, 3); }
1292
+// SMLALS RdLo, RdHi, Rm, Rs
1293
+static INSN_REGPARM void arm0F9(u32 opcode) { MUL_INSN(OP_SMLAL, SETCOND_MULL, 3); }
1294
+
1295
+// Misc instructions //////////////////////////////////////////////////////
1296
+
1297
+// SWP Rd, Rm, [Rn]
1298
+static INSN_REGPARM void arm109(u32 opcode)
1299
+{
1300
+    u32 address = reg[(opcode >> 16) & 15].I;
1301
+    u32 temp = CPUReadMemory(address);
1302
+    CPUWriteMemory(address, reg[opcode&15].I);
1303
+    reg[(opcode >> 12) & 15].I = temp;
1304
+    clockTicks = 4 + dataTicksAccess32(address) + dataTicksAccess32(address)
1305
+                   + codeTicksAccess32(armNextPC);
1306
+}
1307
+
1308
+// SWPB Rd, Rm, [Rn]
1309
+static INSN_REGPARM void arm149(u32 opcode)
1310
+{
1311
+    u32 address = reg[(opcode >> 16) & 15].I;
1312
+    u32 temp = CPUReadByte(address);
1313
+    CPUWriteByte(address, reg[opcode&15].B.B0);
1314
+    reg[(opcode>>12)&15].I = temp;
1315
+    clockTicks = 4 + dataTicksAccess32(address) + dataTicksAccess32(address)
1316
+                   + codeTicksAccess32(armNextPC);
1317
+}
1318
+
1319
+// MRS Rd, CPSR
1320
+static INSN_REGPARM void arm100(u32 opcode)
1321
+{
1322
+    if (LIKELY((opcode & 0x0FFF0FFF) == 0x010F0000)) {
1323
+        CPUUpdateCPSR();
1324
+        reg[(opcode >> 12) & 0x0F].I = reg[16].I;
1325
+    } else {
1326
+        armUnknownInsn(opcode);
1327
+    }
1328
+}
1329
+
1330
+// MRS Rd, SPSR
1331
+static INSN_REGPARM void arm140(u32 opcode)
1332
+{
1333
+    if (LIKELY((opcode & 0x0FFF0FFF) == 0x014F0000)) {
1334
+        reg[(opcode >> 12) & 0x0F].I = reg[17].I;
1335
+    } else {
1336
+        armUnknownInsn(opcode);
1337
+    }
1338
+}
1339
+
1340
+// MSR CPSR_fields, Rm
1341
+static INSN_REGPARM void arm120(u32 opcode)
1342
+{
1343
+    if (LIKELY((opcode & 0x0FF0FFF0) == 0x0120F000)) {
1344
+        CPUUpdateCPSR();
1345
+        u32 value = reg[opcode & 15].I;
1346
+        u32 newValue = reg[16].I;
1347
+        if (armMode > 0x10) {
1348
+            if (opcode & 0x00010000)
1349
+                newValue = (newValue & 0xFFFFFF00) | (value & 0x000000FF);
1350
+            if (opcode & 0x00020000)
1351
+                newValue = (newValue & 0xFFFF00FF) | (value & 0x0000FF00);
1352
+            if (opcode & 0x00040000)
1353
+                newValue = (newValue & 0xFF00FFFF) | (value & 0x00FF0000);
1354
+        }
1355
+        if (opcode & 0x00080000)
1356
+            newValue = (newValue & 0x00FFFFFF) | (value & 0xFF000000);
1357
+        newValue |= 0x10;
1358
+        CPUSwitchMode(newValue & 0x1F, false);
1359
+        reg[16].I = newValue;
1360
+        CPUUpdateFlags();
1361
+        if (!armState) {  // this should not be allowed, but it seems to work
1362
+            THUMB_PREFETCH;
1363
+            reg[15].I = armNextPC + 2;
1364
+        }
1365
+    } else {
1366
+        armUnknownInsn(opcode);
1367
+    }
1368
+}
1369
+
1370
+// MSR SPSR_fields, Rm
1371
+static INSN_REGPARM void arm160(u32 opcode)
1372
+{
1373
+    if (LIKELY((opcode & 0x0FF0FFF0) == 0x0160F000)) {
1374
+        u32 value = reg[opcode & 15].I;
1375
+        if (armMode > 0x10 && armMode < 0x1F) {
1376
+            if (opcode & 0x00010000)
1377
+                reg[17].I = (reg[17].I & 0xFFFFFF00) | (value & 0x000000FF);
1378
+            if (opcode & 0x00020000)
1379
+                reg[17].I = (reg[17].I & 0xFFFF00FF) | (value & 0x0000FF00);
1380
+            if (opcode & 0x00040000)
1381
+                reg[17].I = (reg[17].I & 0xFF00FFFF) | (value & 0x00FF0000);
1382
+            if (opcode & 0x00080000)
1383
+                reg[17].I = (reg[17].I & 0x00FFFFFF) | (value & 0xFF000000);
1384
+        }
1385
+    } else {
1386
+        armUnknownInsn(opcode);
1387
+    }
1388
+}
1389
+
1390
+// MSR CPSR_fields, #
1391
+static INSN_REGPARM void arm320(u32 opcode)
1392
+{
1393
+    if (LIKELY((opcode & 0x0FF0F000) == 0x0320F000)) {
1394
+        CPUUpdateCPSR();
1395
+        u32 value = opcode & 0xFF;
1396
+        int shift = (opcode & 0xF00) >> 7;
1397
+        if (shift) {
1398
+            ROR_IMM_MSR;
1399
+        }
1400
+        u32 newValue = reg[16].I;
1401
+        if (armMode > 0x10) {
1402
+            if (opcode & 0x00010000)
1403
+                newValue = (newValue & 0xFFFFFF00) | (value & 0x000000FF);
1404
+            if (opcode & 0x00020000)
1405
+                newValue = (newValue & 0xFFFF00FF) | (value & 0x0000FF00);
1406
+            if (opcode & 0x00040000)
1407
+                newValue = (newValue & 0xFF00FFFF) | (value & 0x00FF0000);
1408
+        }
1409
+        if (opcode & 0x00080000)
1410
+            newValue = (newValue & 0x00FFFFFF) | (value & 0xFF000000);
1411
+
1412
+        newValue |= 0x10;
1413
+
1414
+        CPUSwitchMode(newValue & 0x1F, false);
1415
+        reg[16].I = newValue;
1416
+        CPUUpdateFlags();
1417
+        if (!armState) {  // this should not be allowed, but it seems to work
1418
+            THUMB_PREFETCH;
1419
+            reg[15].I = armNextPC + 2;
1420
+        }
1421
+    } else {
1422
+        armUnknownInsn(opcode);
1423
+    }
1424
+}
1425
+
1426
+// MSR SPSR_fields, #
1427
+static INSN_REGPARM void arm360(u32 opcode)
1428
+{
1429
+    if (LIKELY((opcode & 0x0FF0F000) == 0x0360F000)) {
1430
+        if (armMode > 0x10 && armMode < 0x1F) {
1431
+            u32 value = opcode & 0xFF;
1432
+            int shift = (opcode & 0xF00) >> 7;
1433
+            if (shift) {
1434
+                ROR_IMM_MSR;
1435
+            }
1436
+            if (opcode & 0x00010000)
1437
+                reg[17].I = (reg[17].I & 0xFFFFFF00) | (value & 0x000000FF);
1438
+            if (opcode & 0x00020000)
1439
+                reg[17].I = (reg[17].I & 0xFFFF00FF) | (value & 0x0000FF00);
1440
+            if (opcode & 0x00040000)
1441
+                reg[17].I = (reg[17].I & 0xFF00FFFF) | (value & 0x00FF0000);
1442
+            if (opcode & 0x00080000)
1443
+                reg[17].I = (reg[17].I & 0x00FFFFFF) | (value & 0xFF000000);
1444
+        }
1445
+    } else {
1446
+        armUnknownInsn(opcode);
1447
+    }
1448
+}
1449
+
1450
+// BX Rm
1451
+static INSN_REGPARM void arm121(u32 opcode)
1452
+{
1453
+    if (LIKELY((opcode & 0x0FFFFFF0) == 0x012FFF10)) {
1454
+        int base = opcode & 0x0F;
1455
+        busPrefetchCount = 0;
1456
+        armState = reg[base].I & 1 ? false : true;
1457
+        if (armState) {
1458
+            reg[15].I = reg[base].I & 0xFFFFFFFC;
1459
+            armNextPC = reg[15].I;
1460
+            reg[15].I += 4;
1461
+            ARM_PREFETCH;
1462
+            clockTicks = 3 + codeTicksAccessSeq32(armNextPC)
1463
+                           + codeTicksAccessSeq32(armNextPC)
1464
+                           + codeTicksAccess32(armNextPC);
1465
+        } else {
1466
+            reg[15].I = reg[base].I & 0xFFFFFFFE;
1467
+            armNextPC = reg[15].I;
1468
+            reg[15].I += 2;
1469
+            THUMB_PREFETCH;
1470
+            clockTicks = 3 + codeTicksAccessSeq16(armNextPC)
1471
+                           + codeTicksAccessSeq16(armNextPC)
1472
+                           + codeTicksAccess16(armNextPC);
1473
+        }
1474
+    } else {
1475
+        armUnknownInsn(opcode);
1476
+    }
1477
+}
1478
+
1479
+// Load/store /////////////////////////////////////////////////////////////
1480
+
1481
+#define OFFSET_IMM \
1482
+    int offset = opcode & 0xFFF;
1483
+#define OFFSET_IMM8 \
1484
+    int offset = ((opcode & 0x0F) | ((opcode>>4) & 0xF0));
1485
+#define OFFSET_REG \
1486
+    int offset = reg[opcode & 15].I;
1487
+#define OFFSET_LSL \
1488
+    int offset = reg[opcode & 15].I << ((opcode>>7) & 31);
1489
+#define OFFSET_LSR \
1490
+    int shift = (opcode >> 7) & 31;                     \
1491
+    int offset = shift ? reg[opcode & 15].I >> shift : 0;
1492
+#define OFFSET_ASR \
1493
+    int shift = (opcode >> 7) & 31;                     \
1494
+    int offset;                                         \
1495
+    if (shift)                                          \
1496
+        offset = (int)((s32)reg[opcode & 15].I >> shift);\
1497
+    else if (reg[opcode & 15].I & 0x80000000)           \
1498
+        offset = 0xFFFFFFFF;                            \
1499
+    else                                                \
1500
+        offset = 0;
1501
+#define OFFSET_ROR \
1502
+    int shift = (opcode >> 7) & 31;                     \
1503
+    u32 offset = reg[opcode & 15].I;                    \
1504
+    if (shift) {                                        \
1505
+        ROR_OFFSET;                                     \
1506
+    } else {                                            \
1507
+        RRX_OFFSET;                                     \
1508
+    }
1509
+
1510
+#define ADDRESS_POST (reg[base].I)
1511
+#define ADDRESS_PREDEC (reg[base].I - offset)
1512
+#define ADDRESS_PREINC (reg[base].I + offset)
1513
+
1514
+#define OP_STR    CPUWriteMemory(address, reg[dest].I)
1515
+#define OP_STRH   CPUWriteHalfWord(address, reg[dest].W.W0)
1516
+#define OP_STRB   CPUWriteByte(address, reg[dest].B.B0)
1517
+#define OP_LDR    reg[dest].I = CPUReadMemory(address)
1518
+#define OP_LDRH   reg[dest].I = CPUReadHalfWord(address)
1519
+#define OP_LDRB   reg[dest].I = CPUReadByte(address)
1520
+#define OP_LDRSH  reg[dest].I = (s16)CPUReadHalfWordSigned(address)
1521
+#define OP_LDRSB  reg[dest].I = (s8)CPUReadByte(address)
1522
+
1523
+#define WRITEBACK_NONE     /*nothing*/
1524
+#define WRITEBACK_PRE      reg[base].I = address
1525
+#define WRITEBACK_POSTDEC  reg[base].I = address - offset
1526
+#define WRITEBACK_POSTINC  reg[base].I = address + offset
1527
+
1528
+#define LDRSTR_INIT(CALC_OFFSET, CALC_ADDRESS) \
1529
+    if (busPrefetchCount == 0)                          \
1530
+        busPrefetch = busPrefetchEnable;                \
1531
+    int dest = (opcode >> 12) & 15;                     \
1532
+    int base = (opcode >> 16) & 15;                     \
1533
+    CALC_OFFSET;                                        \
1534
+    u32 address = CALC_ADDRESS;
1535
+
1536
+#define STR(CALC_OFFSET, CALC_ADDRESS, STORE_DATA, WRITEBACK1, WRITEBACK2, SIZE) \
1537
+    LDRSTR_INIT(CALC_OFFSET, CALC_ADDRESS);             \
1538
+    WRITEBACK1;                                         \
1539
+    STORE_DATA;                                         \
1540
+    WRITEBACK2;                                         \
1541
+    clockTicks = 2 + dataTicksAccess##SIZE(address)     \
1542
+                   + codeTicksAccess32(armNextPC);
1543
+#define LDR(CALC_OFFSET, CALC_ADDRESS, LOAD_DATA, WRITEBACK, SIZE) \
1544
+    LDRSTR_INIT(CALC_OFFSET, CALC_ADDRESS);             \
1545
+    LOAD_DATA;                                          \
1546
+    if (dest != base)                                   \
1547
+    {                                                   \
1548
+        WRITEBACK;                                      \
1549
+    }                                                   \
1550
+    clockTicks = 0;                                     \
1551
+    if (dest == 15) {                                   \
1552
+        reg[15].I &= 0xFFFFFFFC;                        \
1553
+        armNextPC = reg[15].I;                          \
1554
+        reg[15].I += 4;                                 \
1555
+        ARM_PREFETCH;                                   \
1556
+        clockTicks += 2 + dataTicksAccessSeq32(address) \
1557
+                        + dataTicksAccessSeq32(address);\
1558
+    }                                                   \
1559
+    clockTicks += 3 + dataTicksAccess##SIZE(address)    \
1560
+                    + codeTicksAccess32(armNextPC);
1561
+#define STR_POSTDEC(CALC_OFFSET, STORE_DATA, SIZE) \
1562
+  STR(CALC_OFFSET, ADDRESS_POST, STORE_DATA, WRITEBACK_NONE, WRITEBACK_POSTDEC, SIZE)
1563
+#define STR_POSTINC(CALC_OFFSET, STORE_DATA, SIZE) \
1564
+  STR(CALC_OFFSET, ADDRESS_POST, STORE_DATA, WRITEBACK_NONE, WRITEBACK_POSTINC, SIZE)
1565
+#define STR_PREDEC(CALC_OFFSET, STORE_DATA, SIZE) \
1566
+  STR(CALC_OFFSET, ADDRESS_PREDEC, STORE_DATA, WRITEBACK_NONE, WRITEBACK_NONE, SIZE)
1567
+#define STR_PREDEC_WB(CALC_OFFSET, STORE_DATA, SIZE) \
1568
+  STR(CALC_OFFSET, ADDRESS_PREDEC, STORE_DATA, WRITEBACK_PRE, WRITEBACK_NONE, SIZE)
1569
+#define STR_PREINC(CALC_OFFSET, STORE_DATA, SIZE) \
1570
+  STR(CALC_OFFSET, ADDRESS_PREINC, STORE_DATA, WRITEBACK_NONE, WRITEBACK_NONE, SIZE)
1571
+#define STR_PREINC_WB(CALC_OFFSET, STORE_DATA, SIZE) \
1572
+  STR(CALC_OFFSET, ADDRESS_PREINC, STORE_DATA, WRITEBACK_PRE, WRITEBACK_NONE, SIZE)
1573
+#define LDR_POSTDEC(CALC_OFFSET, LOAD_DATA, SIZE) \
1574
+  LDR(CALC_OFFSET, ADDRESS_POST, LOAD_DATA, WRITEBACK_POSTDEC, SIZE)
1575
+#define LDR_POSTINC(CALC_OFFSET, LOAD_DATA, SIZE) \
1576
+  LDR(CALC_OFFSET, ADDRESS_POST, LOAD_DATA, WRITEBACK_POSTINC, SIZE)
1577
+#define LDR_PREDEC(CALC_OFFSET, LOAD_DATA, SIZE) \
1578
+  LDR(CALC_OFFSET, ADDRESS_PREDEC, LOAD_DATA, WRITEBACK_NONE, SIZE)
1579
+#define LDR_PREDEC_WB(CALC_OFFSET, LOAD_DATA, SIZE) \
1580
+  LDR(CALC_OFFSET, ADDRESS_PREDEC, LOAD_DATA, WRITEBACK_PRE, SIZE)
1581
+#define LDR_PREINC(CALC_OFFSET, LOAD_DATA, SIZE) \
1582
+  LDR(CALC_OFFSET, ADDRESS_PREINC, LOAD_DATA, WRITEBACK_NONE, SIZE)
1583
+#define LDR_PREINC_WB(CALC_OFFSET, LOAD_DATA, SIZE) \
1584
+  LDR(CALC_OFFSET, ADDRESS_PREINC, LOAD_DATA, WRITEBACK_PRE, SIZE)
1585
+
1586
+// STRH Rd, [Rn], -Rm
1587
+static INSN_REGPARM void arm00B(u32 opcode) { STR_POSTDEC(OFFSET_REG, OP_STRH, 16); }
1588
+// STRH Rd, [Rn], #-offset
1589
+static INSN_REGPARM void arm04B(u32 opcode) { STR_POSTDEC(OFFSET_IMM8, OP_STRH, 16); }
1590
+// STRH Rd, [Rn], Rm
1591
+static INSN_REGPARM void arm08B(u32 opcode) { STR_POSTINC(OFFSET_REG, OP_STRH, 16); }
1592
+// STRH Rd, [Rn], #offset
1593
+static INSN_REGPARM void arm0CB(u32 opcode) { STR_POSTINC(OFFSET_IMM8, OP_STRH, 16); }
1594
+// STRH Rd, [Rn, -Rm]
1595
+static INSN_REGPARM void arm10B(u32 opcode) { STR_PREDEC(OFFSET_REG, OP_STRH, 16); }
1596
+// STRH Rd, [Rn, -Rm]!
1597
+static INSN_REGPARM void arm12B(u32 opcode) { STR_PREDEC_WB(OFFSET_REG, OP_STRH, 16); }
1598
+// STRH Rd, [Rn, -#offset]
1599
+static INSN_REGPARM void arm14B(u32 opcode) { STR_PREDEC(OFFSET_IMM8, OP_STRH, 16); }
1600
+// STRH Rd, [Rn, -#offset]!
1601
+static INSN_REGPARM void arm16B(u32 opcode) { STR_PREDEC_WB(OFFSET_IMM8, OP_STRH, 16); }
1602
+// STRH Rd, [Rn, Rm]
1603
+static INSN_REGPARM void arm18B(u32 opcode) { STR_PREINC(OFFSET_REG, OP_STRH, 16); }
1604
+// STRH Rd, [Rn, Rm]!
1605
+static INSN_REGPARM void arm1AB(u32 opcode) { STR_PREINC_WB(OFFSET_REG, OP_STRH, 16); }
1606
+// STRH Rd, [Rn, #offset]
1607
+static INSN_REGPARM void arm1CB(u32 opcode) { STR_PREINC(OFFSET_IMM8, OP_STRH, 16); }
1608
+// STRH Rd, [Rn, #offset]!
1609
+static INSN_REGPARM void arm1EB(u32 opcode) { STR_PREINC_WB(OFFSET_IMM8, OP_STRH, 16); }
1610
+
1611
+// LDRH Rd, [Rn], -Rm
1612
+static INSN_REGPARM void arm01B(u32 opcode) { LDR_POSTDEC(OFFSET_REG, OP_LDRH, 16); }
1613
+// LDRH Rd, [Rn], #-offset
1614
+static INSN_REGPARM void arm05B(u32 opcode) { LDR_POSTDEC(OFFSET_IMM8, OP_LDRH, 16); }
1615
+// LDRH Rd, [Rn], Rm
1616
+static INSN_REGPARM void arm09B(u32 opcode) { LDR_POSTINC(OFFSET_REG, OP_LDRH, 16); }
1617
+// LDRH Rd, [Rn], #offset
1618
+static INSN_REGPARM void arm0DB(u32 opcode) { LDR_POSTINC(OFFSET_IMM8, OP_LDRH, 16); }
1619
+// LDRH Rd, [Rn, -Rm]
1620
+static INSN_REGPARM void arm11B(u32 opcode) { LDR_PREDEC(OFFSET_REG, OP_LDRH, 16); }
1621
+// LDRH Rd, [Rn, -Rm]!
1622
+static INSN_REGPARM void arm13B(u32 opcode) { LDR_PREDEC_WB(OFFSET_REG, OP_LDRH, 16); }
1623
+// LDRH Rd, [Rn, -#offset]
1624
+static INSN_REGPARM void arm15B(u32 opcode) { LDR_PREDEC(OFFSET_IMM8, OP_LDRH, 16); }
1625
+// LDRH Rd, [Rn, -#offset]!
1626
+static INSN_REGPARM void arm17B(u32 opcode) { LDR_PREDEC_WB(OFFSET_IMM8, OP_LDRH, 16); }
1627
+// LDRH Rd, [Rn, Rm]
1628
+static INSN_REGPARM void arm19B(u32 opcode) { LDR_PREINC(OFFSET_REG, OP_LDRH, 16); }
1629
+// LDRH Rd, [Rn, Rm]!
1630
+static INSN_REGPARM void arm1BB(u32 opcode) { LDR_PREINC_WB(OFFSET_REG, OP_LDRH, 16); }
1631
+// LDRH Rd, [Rn, #offset]
1632
+static INSN_REGPARM void arm1DB(u32 opcode) { LDR_PREINC(OFFSET_IMM8, OP_LDRH, 16); }
1633
+// LDRH Rd, [Rn, #offset]!
1634
+static INSN_REGPARM void arm1FB(u32 opcode) { LDR_PREINC_WB(OFFSET_IMM8, OP_LDRH, 16); }
1635
+
1636
+// LDRSB Rd, [Rn], -Rm
1637
+static INSN_REGPARM void arm01D(u32 opcode) { LDR_POSTDEC(OFFSET_REG, OP_LDRSB, 16); }
1638
+// LDRSB Rd, [Rn], #-offset
1639
+static INSN_REGPARM void arm05D(u32 opcode) { LDR_POSTDEC(OFFSET_IMM8, OP_LDRSB, 16); }
1640
+// LDRSB Rd, [Rn], Rm
1641
+static INSN_REGPARM void arm09D(u32 opcode) { LDR_POSTINC(OFFSET_REG, OP_LDRSB, 16); }
1642
+// LDRSB Rd, [Rn], #offset
1643
+static INSN_REGPARM void arm0DD(u32 opcode) { LDR_POSTINC(OFFSET_IMM8, OP_LDRSB, 16); }
1644
+// LDRSB Rd, [Rn, -Rm]
1645
+static INSN_REGPARM void arm11D(u32 opcode) { LDR_PREDEC(OFFSET_REG, OP_LDRSB, 16); }
1646
+// LDRSB Rd, [Rn, -Rm]!
1647
+static INSN_REGPARM void arm13D(u32 opcode) { LDR_PREDEC_WB(OFFSET_REG, OP_LDRSB, 16); }
1648
+// LDRSB Rd, [Rn, -#offset]
1649
+static INSN_REGPARM void arm15D(u32 opcode) { LDR_PREDEC(OFFSET_IMM8, OP_LDRSB, 16); }
1650
+// LDRSB Rd, [Rn, -#offset]!
1651
+static INSN_REGPARM void arm17D(u32 opcode) { LDR_PREDEC_WB(OFFSET_IMM8, OP_LDRSB, 16); }
1652
+// LDRSB Rd, [Rn, Rm]
1653
+static INSN_REGPARM void arm19D(u32 opcode) { LDR_PREINC(OFFSET_REG, OP_LDRSB, 16); }
1654
+// LDRSB Rd, [Rn, Rm]!
1655
+static INSN_REGPARM void arm1BD(u32 opcode) { LDR_PREINC_WB(OFFSET_REG, OP_LDRSB, 16); }
1656
+// LDRSB Rd, [Rn, #offset]
1657
+static INSN_REGPARM void arm1DD(u32 opcode) { LDR_PREINC(OFFSET_IMM8, OP_LDRSB, 16); }
1658
+// LDRSB Rd, [Rn, #offset]!
1659
+static INSN_REGPARM void arm1FD(u32 opcode) { LDR_PREINC_WB(OFFSET_IMM8, OP_LDRSB, 16); }
1660
+
1661
+// LDRSH Rd, [Rn], -Rm
1662
+static INSN_REGPARM void arm01F(u32 opcode) { LDR_POSTDEC(OFFSET_REG, OP_LDRSH, 16); }
1663
+// LDRSH Rd, [Rn], #-offset
1664
+static INSN_REGPARM void arm05F(u32 opcode) { LDR_POSTDEC(OFFSET_IMM8, OP_LDRSH, 16); }
1665
+// LDRSH Rd, [Rn], Rm
1666
+static INSN_REGPARM void arm09F(u32 opcode) { LDR_POSTINC(OFFSET_REG, OP_LDRSH, 16); }
1667
+// LDRSH Rd, [Rn], #offset
1668
+static INSN_REGPARM void arm0DF(u32 opcode) { LDR_POSTINC(OFFSET_IMM8, OP_LDRSH, 16); }
1669
+// LDRSH Rd, [Rn, -Rm]
1670
+static INSN_REGPARM void arm11F(u32 opcode) { LDR_PREDEC(OFFSET_REG, OP_LDRSH, 16); }
1671
+// LDRSH Rd, [Rn, -Rm]!
1672
+static INSN_REGPARM void arm13F(u32 opcode) { LDR_PREDEC_WB(OFFSET_REG, OP_LDRSH, 16); }
1673
+// LDRSH Rd, [Rn, -#offset]
1674
+static INSN_REGPARM void arm15F(u32 opcode) { LDR_PREDEC(OFFSET_IMM8, OP_LDRSH, 16); }
1675
+// LDRSH Rd, [Rn, -#offset]!
1676
+static INSN_REGPARM void arm17F(u32 opcode) { LDR_PREDEC_WB(OFFSET_IMM8, OP_LDRSH, 16); }
1677
+// LDRSH Rd, [Rn, Rm]
1678
+static INSN_REGPARM void arm19F(u32 opcode) { LDR_PREINC(OFFSET_REG, OP_LDRSH, 16); }
1679
+// LDRSH Rd, [Rn, Rm]!
1680
+static INSN_REGPARM void arm1BF(u32 opcode) { LDR_PREINC_WB(OFFSET_REG, OP_LDRSH, 16); }
1681
+// LDRSH Rd, [Rn, #offset]
1682
+static INSN_REGPARM void arm1DF(u32 opcode) { LDR_PREINC(OFFSET_IMM8, OP_LDRSH, 16); }
1683
+// LDRSH Rd, [Rn, #offset]!
1684
+static INSN_REGPARM void arm1FF(u32 opcode) { LDR_PREINC_WB(OFFSET_IMM8, OP_LDRSH, 16); }
1685
+
1686
+// STR[T] Rd, [Rn], -#
1687
+// Note: STR and STRT do the same thing on the GBA (likewise for LDR/LDRT etc)
1688
+static INSN_REGPARM void arm400(u32 opcode) { STR_POSTDEC(OFFSET_IMM, OP_STR, 32); }
1689
+// LDR[T] Rd, [Rn], -#
1690
+static INSN_REGPARM void arm410(u32 opcode) { LDR_POSTDEC(OFFSET_IMM, OP_LDR, 32); }
1691
+// STRB[T] Rd, [Rn], -#
1692
+static INSN_REGPARM void arm440(u32 opcode) { STR_POSTDEC(OFFSET_IMM, OP_STRB, 16); }
1693
+// LDRB[T] Rd, [Rn], -#
1694
+static INSN_REGPARM void arm450(u32 opcode) { LDR_POSTDEC(OFFSET_IMM, OP_LDRB, 16); }
1695
+// STR[T] Rd, [Rn], #
1696
+static INSN_REGPARM void arm480(u32 opcode) { STR_POSTINC(OFFSET_IMM, OP_STR, 32); }
1697
+// LDR Rd, [Rn], #
1698
+static INSN_REGPARM void arm490(u32 opcode) { LDR_POSTINC(OFFSET_IMM, OP_LDR, 32); }
1699
+// STRB[T] Rd, [Rn], #
1700
+static INSN_REGPARM void arm4C0(u32 opcode) { STR_POSTINC(OFFSET_IMM, OP_STRB, 16); }
1701
+// LDRB[T] Rd, [Rn], #
1702
+static INSN_REGPARM void arm4D0(u32 opcode) { LDR_POSTINC(OFFSET_IMM, OP_LDRB, 16); }
1703
+// STR Rd, [Rn, -#]
1704
+static INSN_REGPARM void arm500(u32 opcode) { STR_PREDEC(OFFSET_IMM, OP_STR, 32); }
1705
+// LDR Rd, [Rn, -#]
1706
+static INSN_REGPARM void arm510(u32 opcode) { LDR_PREDEC(OFFSET_IMM, OP_LDR, 32); }
1707
+// STR Rd, [Rn, -#]!
1708
+static INSN_REGPARM void arm520(u32 opcode) { STR_PREDEC_WB(OFFSET_IMM, OP_STR, 32); }
1709
+// LDR Rd, [Rn, -#]!
1710
+static INSN_REGPARM void arm530(u32 opcode) { LDR_PREDEC_WB(OFFSET_IMM, OP_LDR, 32); }
1711
+// STRB Rd, [Rn, -#]
1712
+static INSN_REGPARM void arm540(u32 opcode) { STR_PREDEC(OFFSET_IMM, OP_STRB, 16); }
1713
+// LDRB Rd, [Rn, -#]
1714
+static INSN_REGPARM void arm550(u32 opcode) { LDR_PREDEC(OFFSET_IMM, OP_LDRB, 16); }
1715
+// STRB Rd, [Rn, -#]!
1716
+static INSN_REGPARM void arm560(u32 opcode) { STR_PREDEC_WB(OFFSET_IMM, OP_STRB, 16); }
1717
+// LDRB Rd, [Rn, -#]!
1718
+static INSN_REGPARM void arm570(u32 opcode) { LDR_PREDEC_WB(OFFSET_IMM, OP_LDRB, 16); }
1719
+// STR Rd, [Rn, #]
1720
+static INSN_REGPARM void arm580(u32 opcode) { STR_PREINC(OFFSET_IMM, OP_STR, 32); }
1721
+// LDR Rd, [Rn, #]
1722
+static INSN_REGPARM void arm590(u32 opcode) { LDR_PREINC(OFFSET_IMM, OP_LDR, 32); }
1723
+// STR Rd, [Rn, #]!
1724
+static INSN_REGPARM void arm5A0(u32 opcode) { STR_PREINC_WB(OFFSET_IMM, OP_STR, 32); }
1725
+// LDR Rd, [Rn, #]!
1726
+static INSN_REGPARM void arm5B0(u32 opcode) { LDR_PREINC_WB(OFFSET_IMM, OP_LDR, 32); }
1727
+// STRB Rd, [Rn, #]
1728
+static INSN_REGPARM void arm5C0(u32 opcode) { STR_PREINC(OFFSET_IMM, OP_STRB, 16); }
1729
+// LDRB Rd, [Rn, #]
1730
+static INSN_REGPARM void arm5D0(u32 opcode) { LDR_PREINC(OFFSET_IMM, OP_LDRB, 16); }
1731
+// STRB Rd, [Rn, #]!
1732
+static INSN_REGPARM void arm5E0(u32 opcode) { STR_PREINC_WB(OFFSET_IMM, OP_STRB, 16); }
1733
+// LDRB Rd, [Rn, #]!
1734
+static INSN_REGPARM void arm5F0(u32 opcode) { LDR_PREINC_WB(OFFSET_IMM, OP_LDRB, 16); }
1735
+
1736
+// STR[T] Rd, [Rn], -Rm, LSL #
1737
+static INSN_REGPARM void arm600(u32 opcode) { STR_POSTDEC(OFFSET_LSL, OP_STR, 32); }
1738
+// STR[T] Rd, [Rn], -Rm, LSR #
1739
+static INSN_REGPARM void arm602(u32 opcode) { STR_POSTDEC(OFFSET_LSR, OP_STR, 32); }
1740
+// STR[T] Rd, [Rn], -Rm, ASR #
1741
+static INSN_REGPARM void arm604(u32 opcode) { STR_POSTDEC(OFFSET_ASR, OP_STR, 32); }
1742
+// STR[T] Rd, [Rn], -Rm, ROR #
1743
+static INSN_REGPARM void arm606(u32 opcode) { STR_POSTDEC(OFFSET_ROR, OP_STR, 32); }
1744
+// LDR[T] Rd, [Rn], -Rm, LSL #
1745
+static INSN_REGPARM void arm610(u32 opcode) { LDR_POSTDEC(OFFSET_LSL, OP_LDR, 32); }
1746
+// LDR[T] Rd, [Rn], -Rm, LSR #
1747
+static INSN_REGPARM void arm612(u32 opcode) { LDR_POSTDEC(OFFSET_LSR, OP_LDR, 32); }
1748
+// LDR[T] Rd, [Rn], -Rm, ASR #
1749
+static INSN_REGPARM void arm614(u32 opcode) { LDR_POSTDEC(OFFSET_ASR, OP_LDR, 32); }
1750
+// LDR[T] Rd, [Rn], -Rm, ROR #
1751
+static INSN_REGPARM void arm616(u32 opcode) { LDR_POSTDEC(OFFSET_ROR, OP_LDR, 32); }
1752
+// STRB[T] Rd, [Rn], -Rm, LSL #
1753
+static INSN_REGPARM void arm640(u32 opcode) { STR_POSTDEC(OFFSET_LSL, OP_STRB, 16); }
1754
+// STRB[T] Rd, [Rn], -Rm, LSR #
1755
+static INSN_REGPARM void arm642(u32 opcode) { STR_POSTDEC(OFFSET_LSR, OP_STRB, 16); }
1756
+// STRB[T] Rd, [Rn], -Rm, ASR #
1757
+static INSN_REGPARM void arm644(u32 opcode) { STR_POSTDEC(OFFSET_ASR, OP_STRB, 16); }
1758
+// STRB[T] Rd, [Rn], -Rm, ROR #
1759
+static INSN_REGPARM void arm646(u32 opcode) { STR_POSTDEC(OFFSET_ROR, OP_STRB, 16); }
1760
+// LDRB[T] Rd, [Rn], -Rm, LSL #
1761
+static INSN_REGPARM void arm650(u32 opcode) { LDR_POSTDEC(OFFSET_LSL, OP_LDRB, 16); }
1762
+// LDRB[T] Rd, [Rn], -Rm, LSR #
1763
+static INSN_REGPARM void arm652(u32 opcode) { LDR_POSTDEC(OFFSET_LSR, OP_LDRB, 16); }
1764
+// LDRB[T] Rd, [Rn], -Rm, ASR #
1765
+static INSN_REGPARM void arm654(u32 opcode) { LDR_POSTDEC(OFFSET_ASR, OP_LDRB, 16); }
1766
+// LDRB Rd, [Rn], -Rm, ROR #
1767
+static INSN_REGPARM void arm656(u32 opcode) { LDR_POSTDEC(OFFSET_ROR, OP_LDRB, 16); }
1768
+// STR[T] Rd, [Rn], Rm, LSL #
1769
+static INSN_REGPARM void arm680(u32 opcode) { STR_POSTINC(OFFSET_LSL, OP_STR, 32); }
1770
+// STR[T] Rd, [Rn], Rm, LSR #
1771
+static INSN_REGPARM void arm682(u32 opcode) { STR_POSTINC(OFFSET_LSR, OP_STR, 32); }
1772
+// STR[T] Rd, [Rn], Rm, ASR #
1773
+static INSN_REGPARM void arm684(u32 opcode) { STR_POSTINC(OFFSET_ASR, OP_STR, 32); }
1774
+// STR[T] Rd, [Rn], Rm, ROR #
1775
+static INSN_REGPARM void arm686(u32 opcode) { STR_POSTINC(OFFSET_ROR, OP_STR, 32); }
1776
+// LDR[T] Rd, [Rn], Rm, LSL #
1777
+static INSN_REGPARM void arm690(u32 opcode) { LDR_POSTINC(OFFSET_LSL, OP_LDR, 32); }
1778
+// LDR[T] Rd, [Rn], Rm, LSR #
1779
+static INSN_REGPARM void arm692(u32 opcode) { LDR_POSTINC(OFFSET_LSR, OP_LDR, 32); }
1780
+// LDR[T] Rd, [Rn], Rm, ASR #
1781
+static INSN_REGPARM void arm694(u32 opcode) { LDR_POSTINC(OFFSET_ASR, OP_LDR, 32); }
1782
+// LDR[T] Rd, [Rn], Rm, ROR #
1783
+static INSN_REGPARM void arm696(u32 opcode) { LDR_POSTINC(OFFSET_ROR, OP_LDR, 32); }
1784
+// STRB[T] Rd, [Rn], Rm, LSL #
1785
+static INSN_REGPARM void arm6C0(u32 opcode) { STR_POSTINC(OFFSET_LSL, OP_STRB, 16); }
1786
+// STRB[T] Rd, [Rn], Rm, LSR #
1787
+static INSN_REGPARM void arm6C2(u32 opcode) { STR_POSTINC(OFFSET_LSR, OP_STRB, 16); }
1788
+// STRB[T] Rd, [Rn], Rm, ASR #
1789
+static INSN_REGPARM void arm6C4(u32 opcode) { STR_POSTINC(OFFSET_ASR, OP_STRB, 16); }
1790
+// STRB[T] Rd, [Rn], Rm, ROR #
1791
+static INSN_REGPARM void arm6C6(u32 opcode) { STR_POSTINC(OFFSET_ROR, OP_STRB, 16); }
1792
+// LDRB[T] Rd, [Rn], Rm, LSL #
1793
+static INSN_REGPARM void arm6D0(u32 opcode) { LDR_POSTINC(OFFSET_LSL, OP_LDRB, 16); }
1794
+// LDRB[T] Rd, [Rn], Rm, LSR #
1795
+static INSN_REGPARM void arm6D2(u32 opcode) { LDR_POSTINC(OFFSET_LSR, OP_LDRB, 16); }
1796
+// LDRB[T] Rd, [Rn], Rm, ASR #
1797
+static INSN_REGPARM void arm6D4(u32 opcode) { LDR_POSTINC(OFFSET_ASR, OP_LDRB, 16); }
1798
+// LDRB[T] Rd, [Rn], Rm, ROR #
1799
+static INSN_REGPARM void arm6D6(u32 opcode) { LDR_POSTINC(OFFSET_ROR, OP_LDRB, 16); }
1800
+// STR Rd, [Rn, -Rm, LSL #]
1801
+static INSN_REGPARM void arm700(u32 opcode) { STR_PREDEC(OFFSET_LSL, OP_STR, 32); }
1802
+// STR Rd, [Rn, -Rm, LSR #]
1803
+static INSN_REGPARM void arm702(u32 opcode) { STR_PREDEC(OFFSET_LSR, OP_STR, 32); }
1804
+// STR Rd, [Rn, -Rm, ASR #]
1805
+static INSN_REGPARM void arm704(u32 opcode) { STR_PREDEC(OFFSET_ASR, OP_STR, 32); }
1806
+// STR Rd, [Rn, -Rm, ROR #]
1807
+static INSN_REGPARM void arm706(u32 opcode) { STR_PREDEC(OFFSET_ROR, OP_STR, 32); }
1808
+// LDR Rd, [Rn, -Rm, LSL #]
1809
+static INSN_REGPARM void arm710(u32 opcode) { LDR_PREDEC(OFFSET_LSL, OP_LDR, 32); }
1810
+// LDR Rd, [Rn, -Rm, LSR #]
1811
+static INSN_REGPARM void arm712(u32 opcode) { LDR_PREDEC(OFFSET_LSR, OP_LDR, 32); }
1812
+// LDR Rd, [Rn, -Rm, ASR #]
1813
+static INSN_REGPARM void arm714(u32 opcode) { LDR_PREDEC(OFFSET_ASR, OP_LDR, 32); }
1814
+// LDR Rd, [Rn, -Rm, ROR #]
1815
+static INSN_REGPARM void arm716(u32 opcode) { LDR_PREDEC(OFFSET_ROR, OP_LDR, 32); }
1816
+// STR Rd, [Rn, -Rm, LSL #]!
1817
+static INSN_REGPARM void arm720(u32 opcode) { STR_PREDEC_WB(OFFSET_LSL, OP_STR, 32); }
1818
+// STR Rd, [Rn, -Rm, LSR #]!
1819
+static INSN_REGPARM void arm722(u32 opcode) { STR_PREDEC_WB(OFFSET_LSR, OP_STR, 32); }
1820
+// STR Rd, [Rn, -Rm, ASR #]!
1821
+static INSN_REGPARM void arm724(u32 opcode) { STR_PREDEC_WB(OFFSET_ASR, OP_STR, 32); }
1822
+// STR Rd, [Rn, -Rm, ROR #]!
1823
+static INSN_REGPARM void arm726(u32 opcode) { STR_PREDEC_WB(OFFSET_ROR, OP_STR, 32); }
1824
+// LDR Rd, [Rn, -Rm, LSL #]!
1825
+static INSN_REGPARM void arm730(u32 opcode) { LDR_PREDEC_WB(OFFSET_LSL, OP_LDR, 32); }
1826
+// LDR Rd, [Rn, -Rm, LSR #]!
1827
+static INSN_REGPARM void arm732(u32 opcode) { LDR_PREDEC_WB(OFFSET_LSR, OP_LDR, 32); }
1828
+// LDR Rd, [Rn, -Rm, ASR #]!
1829
+static INSN_REGPARM void arm734(u32 opcode) { LDR_PREDEC_WB(OFFSET_ASR, OP_LDR, 32); }
1830
+// LDR Rd, [Rn, -Rm, ROR #]!
1831
+static INSN_REGPARM void arm736(u32 opcode) { LDR_PREDEC_WB(OFFSET_ROR, OP_LDR, 32); }
1832
+// STRB Rd, [Rn, -Rm, LSL #]
1833
+static INSN_REGPARM void arm740(u32 opcode) { STR_PREDEC(OFFSET_LSL, OP_STRB, 16); }
1834
+// STRB Rd, [Rn, -Rm, LSR #]
1835
+static INSN_REGPARM void arm742(u32 opcode) { STR_PREDEC(OFFSET_LSR, OP_STRB, 16); }
1836
+// STRB Rd, [Rn, -Rm, ASR #]
1837
+static INSN_REGPARM void arm744(u32 opcode) { STR_PREDEC(OFFSET_ASR, OP_STRB, 16); }
1838
+// STRB Rd, [Rn, -Rm, ROR #]
1839
+static INSN_REGPARM void arm746(u32 opcode) { STR_PREDEC(OFFSET_ROR, OP_STRB, 16); }
1840
+// LDRB Rd, [Rn, -Rm, LSL #]
1841
+static INSN_REGPARM void arm750(u32 opcode) { LDR_PREDEC(OFFSET_LSL, OP_LDRB, 16); }
1842
+// LDRB Rd, [Rn, -Rm, LSR #]
1843
+static INSN_REGPARM void arm752(u32 opcode) { LDR_PREDEC(OFFSET_LSR, OP_LDRB, 16); }
1844
+// LDRB Rd, [Rn, -Rm, ASR #]
1845
+static INSN_REGPARM void arm754(u32 opcode) { LDR_PREDEC(OFFSET_ASR, OP_LDRB, 16); }
1846
+// LDRB Rd, [Rn, -Rm, ROR #]
1847
+static INSN_REGPARM void arm756(u32 opcode) { LDR_PREDEC(OFFSET_ROR, OP_LDRB, 16); }
1848
+// STRB Rd, [Rn, -Rm, LSL #]!
1849
+static INSN_REGPARM void arm760(u32 opcode) { STR_PREDEC_WB(OFFSET_LSL, OP_STRB, 16); }
1850
+// STRB Rd, [Rn, -Rm, LSR #]!
1851
+static INSN_REGPARM void arm762(u32 opcode) { STR_PREDEC_WB(OFFSET_LSR, OP_STRB, 16); }
1852
+// STRB Rd, [Rn, -Rm, ASR #]!
1853
+static INSN_REGPARM void arm764(u32 opcode) { STR_PREDEC_WB(OFFSET_ASR, OP_STRB, 16); }
1854
+// STRB Rd, [Rn, -Rm, ROR #]!
1855
+static INSN_REGPARM void arm766(u32 opcode) { STR_PREDEC_WB(OFFSET_ROR, OP_STRB, 16); }
1856
+// LDRB Rd, [Rn, -Rm, LSL #]!
1857
+static INSN_REGPARM void arm770(u32 opcode) { LDR_PREDEC_WB(OFFSET_LSL, OP_LDRB, 16); }
1858
+// LDRB Rd, [Rn, -Rm, LSR #]!
1859
+static INSN_REGPARM void arm772(u32 opcode) { LDR_PREDEC_WB(OFFSET_LSR, OP_LDRB, 16); }
1860
+// LDRB Rd, [Rn, -Rm, ASR #]!
1861
+static INSN_REGPARM void arm774(u32 opcode) { LDR_PREDEC_WB(OFFSET_ASR, OP_LDRB, 16); }
1862
+// LDRB Rd, [Rn, -Rm, ROR #]!
1863
+static INSN_REGPARM void arm776(u32 opcode) { LDR_PREDEC_WB(OFFSET_ROR, OP_LDRB, 16); }
1864
+// STR Rd, [Rn, Rm, LSL #]
1865
+static INSN_REGPARM void arm780(u32 opcode) { STR_PREINC(OFFSET_LSL, OP_STR, 32); }
1866
+// STR Rd, [Rn, Rm, LSR #]
1867
+static INSN_REGPARM void arm782(u32 opcode) { STR_PREINC(OFFSET_LSR, OP_STR, 32); }
1868
+// STR Rd, [Rn, Rm, ASR #]
1869
+static INSN_REGPARM void arm784(u32 opcode) { STR_PREINC(OFFSET_ASR, OP_STR, 32); }
1870
+// STR Rd, [Rn, Rm, ROR #]
1871
+static INSN_REGPARM void arm786(u32 opcode) { STR_PREINC(OFFSET_ROR, OP_STR, 32); }
1872
+// LDR Rd, [Rn, Rm, LSL #]
1873
+static INSN_REGPARM void arm790(u32 opcode) { LDR_PREINC(OFFSET_LSL, OP_LDR, 32); }
1874
+// LDR Rd, [Rn, Rm, LSR #]
1875
+static INSN_REGPARM void arm792(u32 opcode) { LDR_PREINC(OFFSET_LSR, OP_LDR, 32); }
1876
+// LDR Rd, [Rn, Rm, ASR #]
1877
+static INSN_REGPARM void arm794(u32 opcode) { LDR_PREINC(OFFSET_ASR, OP_LDR, 32); }
1878
+// LDR Rd, [Rn, Rm, ROR #]
1879
+static INSN_REGPARM void arm796(u32 opcode) { LDR_PREINC(OFFSET_ROR, OP_LDR, 32); }
1880
+// STR Rd, [Rn, Rm, LSL #]!
1881
+static INSN_REGPARM void arm7A0(u32 opcode) { STR_PREINC_WB(OFFSET_LSL, OP_STR, 32); }
1882
+// STR Rd, [Rn, Rm, LSR #]!
1883
+static INSN_REGPARM void arm7A2(u32 opcode) { STR_PREINC_WB(OFFSET_LSR, OP_STR, 32); }
1884
+// STR Rd, [Rn, Rm, ASR #]!
1885
+static INSN_REGPARM void arm7A4(u32 opcode) { STR_PREINC_WB(OFFSET_ASR, OP_STR, 32); }
1886
+// STR Rd, [Rn, Rm, ROR #]!
1887
+static INSN_REGPARM void arm7A6(u32 opcode) { STR_PREINC_WB(OFFSET_ROR, OP_STR, 32); }
1888
+// LDR Rd, [Rn, Rm, LSL #]!
1889
+static INSN_REGPARM void arm7B0(u32 opcode) { LDR_PREINC_WB(OFFSET_LSL, OP_LDR, 32); }
1890
+// LDR Rd, [Rn, Rm, LSR #]!
1891
+static INSN_REGPARM void arm7B2(u32 opcode) { LDR_PREINC_WB(OFFSET_LSR, OP_LDR, 32); }
1892
+// LDR Rd, [Rn, Rm, ASR #]!
1893
+static INSN_REGPARM void arm7B4(u32 opcode) { LDR_PREINC_WB(OFFSET_ASR, OP_LDR, 32); }
1894
+// LDR Rd, [Rn, Rm, ROR #]!
1895
+static INSN_REGPARM void arm7B6(u32 opcode) { LDR_PREINC_WB(OFFSET_ROR, OP_LDR, 32); }
1896
+// STRB Rd, [Rn, Rm, LSL #]
1897
+static INSN_REGPARM void arm7C0(u32 opcode) { STR_PREINC(OFFSET_LSL, OP_STRB, 16); }
1898
+// STRB Rd, [Rn, Rm, LSR #]
1899
+static INSN_REGPARM void arm7C2(u32 opcode) { STR_PREINC(OFFSET_LSR, OP_STRB, 16); }
1900
+// STRB Rd, [Rn, Rm, ASR #]
1901
+static INSN_REGPARM void arm7C4(u32 opcode) { STR_PREINC(OFFSET_ASR, OP_STRB, 16); }
1902
+// STRB Rd, [Rn, Rm, ROR #]
1903
+static INSN_REGPARM void arm7C6(u32 opcode) { STR_PREINC(OFFSET_ROR, OP_STRB, 16); }
1904
+// LDRB Rd, [Rn, Rm, LSL #]
1905
+static INSN_REGPARM void arm7D0(u32 opcode) { LDR_PREINC(OFFSET_LSL, OP_LDRB, 16); }
1906
+// LDRB Rd, [Rn, Rm, LSR #]
1907
+static INSN_REGPARM void arm7D2(u32 opcode) { LDR_PREINC(OFFSET_LSR, OP_LDRB, 16); }
1908
+// LDRB Rd, [Rn, Rm, ASR #]
1909
+static INSN_REGPARM void arm7D4(u32 opcode) { LDR_PREINC(OFFSET_ASR, OP_LDRB, 16); }
1910
+// LDRB Rd, [Rn, Rm, ROR #]
1911
+static INSN_REGPARM void arm7D6(u32 opcode) { LDR_PREINC(OFFSET_ROR, OP_LDRB, 16); }
1912
+// STRB Rd, [Rn, Rm, LSL #]!
1913
+static INSN_REGPARM void arm7E0(u32 opcode) { STR_PREINC_WB(OFFSET_LSL, OP_STRB, 16); }
1914
+// STRB Rd, [Rn, Rm, LSR #]!
1915
+static INSN_REGPARM void arm7E2(u32 opcode) { STR_PREINC_WB(OFFSET_LSR, OP_STRB, 16); }
1916
+// STRB Rd, [Rn, Rm, ASR #]!
1917
+static INSN_REGPARM void arm7E4(u32 opcode) { STR_PREINC_WB(OFFSET_ASR, OP_STRB, 16); }
1918
+// STRB Rd, [Rn, Rm, ROR #]!
1919
+static INSN_REGPARM void arm7E6(u32 opcode) { STR_PREINC_WB(OFFSET_ROR, OP_STRB, 16); }
1920
+// LDRB Rd, [Rn, Rm, LSL #]!
1921
+static INSN_REGPARM void arm7F0(u32 opcode) { LDR_PREINC_WB(OFFSET_LSL, OP_LDRB, 16); }
1922
+// LDRB Rd, [Rn, Rm, LSR #]!
1923
+static INSN_REGPARM void arm7F2(u32 opcode) { LDR_PREINC_WB(OFFSET_LSR, OP_LDRB, 16); }
1924
+// LDRB Rd, [Rn, Rm, ASR #]!
1925
+static INSN_REGPARM void arm7F4(u32 opcode) { LDR_PREINC_WB(OFFSET_ASR, OP_LDRB, 16); }
1926
+// LDRB Rd, [Rn, Rm, ROR #]!
1927
+static INSN_REGPARM void arm7F6(u32 opcode) { LDR_PREINC_WB(OFFSET_ROR, OP_LDRB, 16); }
1928
+
1929
+// STM/LDM ////////////////////////////////////////////////////////////////
1930
+
1931
+#define STM_REG(bit,num) \
1932
+    if (opcode & (1U<<(bit))) {                         \
1933
+        CPUWriteMemory(address, reg[(num)].I);          \
1934
+        if (!count) {                                   \
1935
+            clockTicks += 1 + dataTicksAccess32(address);\
1936
+        } else {                                        \
1937
+            clockTicks += 1 + dataTicksAccessSeq32(address);\
1938
+        }                                               \
1939
+        count++;                                        \
1940
+        address += 4;                                   \
1941
+    }
1942
+#define STMW_REG(bit,num) \
1943
+    if (opcode & (1U<<(bit))) {                         \
1944
+        CPUWriteMemory(address, reg[(num)].I);          \
1945
+        if (!count) {                                   \
1946
+            clockTicks += 1 + dataTicksAccess32(address);\
1947
+        } else {                                        \
1948
+            clockTicks += 1 + dataTicksAccessSeq32(address);\
1949
+        }                                               \
1950
+        reg[base].I = temp;                             \
1951
+        count++;                                        \
1952
+        address += 4;                                   \
1953
+    }
1954
+#define LDM_REG(bit,num) \
1955
+    if (opcode & (1U<<(bit))) {                         \
1956
+        reg[(num)].I = CPUReadMemory(address);          \
1957
+        if (!count) {                                   \
1958
+            clockTicks += 1 + dataTicksAccess32(address);\
1959
+        } else {                                        \
1960
+            clockTicks += 1 + dataTicksAccessSeq32(address);\
1961
+        }                                               \
1962
+        count++;                                        \
1963
+        address += 4;                                   \
1964
+    }
1965
+#define STM_LOW(STORE_REG) \
1966
+    STORE_REG(0, 0);                                    \
1967
+    STORE_REG(1, 1);                                    \
1968
+    STORE_REG(2, 2);                                    \
1969
+    STORE_REG(3, 3);                                    \
1970
+    STORE_REG(4, 4);                                    \
1971
+    STORE_REG(5, 5);                                    \
1972
+    STORE_REG(6, 6);                                    \
1973
+    STORE_REG(7, 7);
1974
+#define STM_HIGH(STORE_REG) \
1975
+    STORE_REG(8, 8);                                    \
1976
+    STORE_REG(9, 9);                                    \
1977
+    STORE_REG(10, 10);                                  \
1978
+    STORE_REG(11, 11);                                  \
1979
+    STORE_REG(12, 12);                                  \
1980
+    STORE_REG(13, 13);                                  \
1981
+    STORE_REG(14, 14);
1982
+#define STM_HIGH_2(STORE_REG) \
1983
+    if (armMode == 0x11) {                              \
1984
+        STORE_REG(8, R8_FIQ);                           \
1985
+        STORE_REG(9, R9_FIQ);                           \
1986
+        STORE_REG(10, R10_FIQ);                         \
1987
+        STORE_REG(11, R11_FIQ);                         \
1988
+        STORE_REG(12, R12_FIQ);                         \
1989
+    } else {                                            \
1990
+        STORE_REG(8, 8);                                \
1991
+        STORE_REG(9, 9);                                \
1992
+        STORE_REG(10, 10);                              \
1993
+        STORE_REG(11, 11);                              \
1994
+        STORE_REG(12, 12);                              \
1995
+    }                                                   \
1996
+    if (armMode != 0x10 && armMode != 0x1F) {           \
1997
+        STORE_REG(13, R13_USR);                         \
1998
+        STORE_REG(14, R14_USR);                         \
1999
+    } else {                                            \
2000
+        STORE_REG(13, 13);                              \
2001
+        STORE_REG(14, 14);                              \
2002
+    }
2003
+#define STM_PC \
2004
+    if (opcode & (1U<<15)) {                            \
2005
+        CPUWriteMemory(address, reg[15].I+4);           \
2006
+        if (!count) {                                   \
2007
+            clockTicks += 1 + dataTicksAccess32(address);\
2008
+        } else {                                        \
2009
+            clockTicks += 1 + dataTicksAccessSeq32(address);\
2010
+        }                                               \
2011
+        count++;                                        \
2012
+    }
2013
+#define STMW_PC \
2014
+    if (opcode & (1U<<15)) {                            \
2015
+        CPUWriteMemory(address, reg[15].I+4);           \
2016
+        if (!count) {                                   \
2017
+            clockTicks += 1 + dataTicksAccess32(address);\
2018
+        } else {                                        \
2019
+            clockTicks += 1 + dataTicksAccessSeq32(address);\
2020
+        }                                               \
2021
+        reg[base].I = temp;                             \
2022
+        count++;                                        \
2023
+    }
2024
+#define LDM_LOW \
2025
+    LDM_REG(0, 0);                                      \
2026
+    LDM_REG(1, 1);                                      \
2027
+    LDM_REG(2, 2);                                      \
2028
+    LDM_REG(3, 3);                                      \
2029
+    LDM_REG(4, 4);                                      \
2030
+    LDM_REG(5, 5);                                      \
2031
+    LDM_REG(6, 6);                                      \
2032
+    LDM_REG(7, 7);
2033
+#define LDM_HIGH \
2034
+    LDM_REG(8, 8);                                      \
2035
+    LDM_REG(9, 9);                                      \
2036
+    LDM_REG(10, 10);                                    \
2037
+    LDM_REG(11, 11);                                    \
2038
+    LDM_REG(12, 12);                                    \
2039
+    LDM_REG(13, 13);                                    \
2040
+    LDM_REG(14, 14);
2041
+#define LDM_HIGH_2 \
2042
+    if (armMode == 0x11) {                              \
2043
+        LDM_REG(8, R8_FIQ);                             \
2044
+        LDM_REG(9, R9_FIQ);                             \
2045
+        LDM_REG(10, R10_FIQ);                           \
2046
+        LDM_REG(11, R11_FIQ);                           \
2047
+        LDM_REG(12, R12_FIQ);                           \
2048
+    } else {                                            \
2049
+        LDM_REG(8, 8);                                  \
2050
+        LDM_REG(9, 9);                                  \
2051
+        LDM_REG(10, 10);                                \
2052
+        LDM_REG(11, 11);                                \
2053
+        LDM_REG(12, 12);                                \
2054
+    }                                                   \
2055
+    if (armMode != 0x10 && armMode != 0x1F) {           \
2056
+        LDM_REG(13, R13_USR);                           \
2057
+        LDM_REG(14, R14_USR);                           \
2058
+    } else {                                            \
2059
+        LDM_REG(13, 13);                                \
2060
+        LDM_REG(14, 14);                                \
2061
+    }
2062
+#define STM_ALL \
2063
+    STM_LOW(STM_REG);                                   \
2064
+    STM_HIGH(STM_REG);                                  \
2065
+    STM_PC;
2066
+#define STMW_ALL \
2067
+    STM_LOW(STMW_REG);                                  \
2068
+    STM_HIGH(STMW_REG);                                 \
2069
+    STMW_PC;
2070
+#define LDM_ALL \
2071
+    LDM_LOW;                                            \
2072
+    LDM_HIGH;                                           \
2073
+    if (opcode & (1U<<15)) {                            \
2074
+        reg[15].I = CPUReadMemory(address);             \
2075
+        if (!count) {                                   \
2076
+            clockTicks += 1 + dataTicksAccess32(address);\
2077
+        } else {                                        \
2078
+            clockTicks += 1 + dataTicksAccessSeq32(address);\
2079
+        }                                               \
2080
+        count++;                                        \
2081
+    }                                                   \
2082
+    if (opcode & (1U<<15)) {                            \
2083
+        armNextPC = reg[15].I;                          \
2084
+        reg[15].I += 4;                                 \
2085
+        ARM_PREFETCH;                                   \
2086
+        clockTicks += 1 + codeTicksAccessSeq32(armNextPC);\
2087
+    }
2088
+#define STM_ALL_2 \
2089
+    STM_LOW(STM_REG);                                   \
2090
+    STM_HIGH_2(STM_REG);                                \
2091
+    STM_PC;
2092
+#define STMW_ALL_2 \
2093
+    STM_LOW(STMW_REG);                                  \
2094
+    STM_HIGH_2(STMW_REG);                               \
2095
+    STMW_PC;
2096
+#define LDM_ALL_2 \
2097
+    LDM_LOW;                                            \
2098
+    if (opcode & (1U<<15)) {                            \
2099
+        LDM_HIGH;                                       \
2100
+        reg[15].I = CPUReadMemory(address);             \
2101
+        if (!count) {                                   \
2102
+            clockTicks += 1 + dataTicksAccess32(address); \
2103
+        } else {                                        \
2104
+            clockTicks += 1 + dataTicksAccessSeq32(address); \
2105
+        }                                               \
2106
+        count++;                                        \
2107
+    } else {                                            \
2108
+        LDM_HIGH_2;                                     \
2109
+    }
2110
+#define LDM_ALL_2B \
2111
+    if (opcode & (1U<<15)) {                            \
2112
+        CPUSwitchMode(reg[17].I & 0x1F, false);         \
2113
+        if (armState) {                                 \
2114
+            armNextPC = reg[15].I & 0xFFFFFFFC;         \
2115
+            reg[15].I = armNextPC + 4;                  \
2116
+            ARM_PREFETCH;                               \
2117
+        } else {                                        \
2118
+            armNextPC = reg[15].I & 0xFFFFFFFE;         \
2119
+            reg[15].I = armNextPC + 2;                  \
2120
+            THUMB_PREFETCH;                             \
2121
+        }                                               \
2122
+        clockTicks += 1 + codeTicksAccessSeq32(armNextPC);\
2123
+    }
2124
+
2125
+
2126
+// STMDA Rn, {Rlist}
2127
+static INSN_REGPARM void arm800(u32 opcode)
2128
+{
2129
+    if (busPrefetchCount == 0)
2130
+        busPrefetch = busPrefetchEnable;
2131
+    int base = (opcode & 0x000F0000) >> 16;
2132
+    u32 temp = reg[base].I -
2133
+        4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2134
+    u32 address = (temp + 4) & 0xFFFFFFFC;
2135
+    int count = 0;
2136
+    STM_ALL;
2137
+    clockTicks += 1 + codeTicksAccess32(armNextPC);
2138
+}
2139
+
2140
+// LDMDA Rn, {Rlist}
2141
+static INSN_REGPARM void arm810(u32 opcode)
2142
+{
2143
+    if (busPrefetchCount == 0)
2144
+        busPrefetch = busPrefetchEnable;
2145
+    int base = (opcode & 0x000F0000) >> 16;
2146
+    u32 temp = reg[base].I -
2147
+        4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2148
+    u32 address = (temp + 4) & 0xFFFFFFFC;
2149
+    int count = 0;
2150
+    LDM_ALL;
2151
+    clockTicks += 2 + codeTicksAccess32(armNextPC);
2152
+}
2153
+
2154
+// STMDA Rn!, {Rlist}
2155
+static INSN_REGPARM void arm820(u32 opcode)
2156
+{
2157
+    if (busPrefetchCount == 0)
2158
+        busPrefetch = busPrefetchEnable;
2159
+    int base = (opcode & 0x000F0000) >> 16;
2160
+    u32 temp = reg[base].I -
2161
+        4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2162
+    u32 address = (temp+4) & 0xFFFFFFFC;
2163
+    int count = 0;
2164
+    STMW_ALL;
2165
+    clockTicks += 1 + codeTicksAccess32(armNextPC);
2166
+}
2167
+
2168
+// LDMDA Rn!, {Rlist}
2169
+static INSN_REGPARM void arm830(u32 opcode)
2170
+{
2171
+    if (busPrefetchCount == 0)
2172
+        busPrefetch = busPrefetchEnable;
2173
+    int base = (opcode & 0x000F0000) >> 16;
2174
+    u32 temp = reg[base].I -
2175
+        4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2176
+    u32 address = (temp + 4) & 0xFFFFFFFC;
2177
+    int count = 0;
2178
+    LDM_ALL;
2179
+    clockTicks += 2 + codeTicksAccess32(armNextPC);
2180
+    if (!(opcode & (1U << base)))
2181
+        reg[base].I = temp;
2182
+}
2183
+
2184
+// STMDA Rn, {Rlist}^
2185
+static INSN_REGPARM void arm840(u32 opcode)
2186
+{
2187
+    if (busPrefetchCount == 0)
2188
+        busPrefetch = busPrefetchEnable;
2189
+    int base = (opcode & 0x000F0000) >> 16;
2190
+    u32 temp = reg[base].I -
2191
+        4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2192
+    u32 address = (temp+4) & 0xFFFFFFFC;
2193
+    int count = 0;
2194
+    STM_ALL_2;
2195
+    clockTicks += 1 + codeTicksAccess32(armNextPC);
2196
+}
2197
+
2198
+// LDMDA Rn, {Rlist}^
2199
+static INSN_REGPARM void arm850(u32 opcode)
2200
+{
2201
+    if (busPrefetchCount == 0)
2202
+        busPrefetch = busPrefetchEnable;
2203
+    int base = (opcode & 0x000F0000) >> 16;
2204
+    u32 temp = reg[base].I -
2205
+        4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2206
+    u32 address = (temp + 4) & 0xFFFFFFFC;
2207
+    int count = 0;
2208
+    LDM_ALL_2;
2209
+    LDM_ALL_2B;
2210
+    clockTicks += 2 + codeTicksAccess32(armNextPC);
2211
+}
2212
+
2213
+// STMDA Rn!, {Rlist}^
2214
+static INSN_REGPARM void arm860(u32 opcode)
2215
+{
2216
+    if (busPrefetchCount == 0)
2217
+        busPrefetch = busPrefetchEnable;
2218
+    int base = (opcode & 0x000F0000) >> 16;
2219
+    u32 temp = reg[base].I -
2220
+        4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2221
+    u32 address = (temp+4) & 0xFFFFFFFC;
2222
+    int count = 0;
2223
+    STMW_ALL_2;
2224
+    clockTicks += 1 + codeTicksAccess32(armNextPC);
2225
+}
2226
+
2227
+// LDMDA Rn!, {Rlist}^
2228
+static INSN_REGPARM void arm870(u32 opcode)
2229
+{
2230
+    if (busPrefetchCount == 0)
2231
+        busPrefetch = busPrefetchEnable;
2232
+    int base = (opcode & 0x000F0000) >> 16;
2233
+    u32 temp = reg[base].I -
2234
+        4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2235
+    u32 address = (temp + 4) & 0xFFFFFFFC;
2236
+    int count = 0;
2237
+    LDM_ALL_2;
2238
+    if (!(opcode & (1U << base)))
2239
+        reg[base].I = temp;
2240
+    LDM_ALL_2B;
2241
+    clockTicks += 2 + codeTicksAccess32(armNextPC);
2242
+}
2243
+
2244
+// STMIA Rn, {Rlist}
2245
+static INSN_REGPARM void arm880(u32 opcode)
2246
+{
2247
+    if (busPrefetchCount == 0)
2248
+        busPrefetch = busPrefetchEnable;
2249
+    int base = (opcode & 0x000F0000) >> 16;
2250
+    u32 address = reg[base].I & 0xFFFFFFFC;
2251
+    int count = 0;
2252
+    STM_ALL;
2253
+    clockTicks += 1 + codeTicksAccess32(armNextPC);
2254
+}
2255
+
2256
+// LDMIA Rn, {Rlist}
2257
+static INSN_REGPARM void arm890(u32 opcode)
2258
+{
2259
+    if (busPrefetchCount == 0)
2260
+        busPrefetch = busPrefetchEnable;
2261
+    int base = (opcode & 0x000F0000) >> 16;
2262
+    u32 address = reg[base].I & 0xFFFFFFFC;
2263
+    int count = 0;
2264
+    LDM_ALL;
2265
+    clockTicks += 2 + codeTicksAccess32(armNextPC);
2266
+}
2267
+
2268
+// STMIA Rn!, {Rlist}
2269
+static INSN_REGPARM void arm8A0(u32 opcode)
2270
+{
2271
+    if (busPrefetchCount == 0)
2272
+        busPrefetch = busPrefetchEnable;
2273
+    int base = (opcode & 0x000F0000) >> 16;
2274
+    u32 address = reg[base].I & 0xFFFFFFFC;
2275
+    int count = 0;
2276
+    u32 temp = reg[base].I +
2277
+        4 * (cpuBitsSet[opcode & 0xFF] + cpuBitsSet[(opcode >> 8) & 255]);
2278
+    STMW_ALL;
2279
+    clockTicks += 1 + codeTicksAccess32(armNextPC);
2280
+}
2281
+
2282
+// LDMIA Rn!, {Rlist}
2283
+static INSN_REGPARM void arm8B0(u32 opcode)
2284
+{
2285
+    if (busPrefetchCount == 0)
2286
+        busPrefetch = busPrefetchEnable;
2287
+    int base = (opcode & 0x000F0000) >> 16;
2288
+    u32 temp = reg[base].I +
2289
+        4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2290
+    u32 address = reg[base].I & 0xFFFFFFFC;
2291
+    int count = 0;
2292
+    LDM_ALL;
2293
+    clockTicks += 2 + codeTicksAccess32(armNextPC);
2294
+    if (!(opcode & (1U << base)))
2295
+        reg[base].I = temp;
2296
+}
2297
+
2298
+// STMIA Rn, {Rlist}^
2299
+static INSN_REGPARM void arm8C0(u32 opcode)
2300
+{
2301
+    if (busPrefetchCount == 0)
2302
+        busPrefetch = busPrefetchEnable;
2303
+    int base = (opcode & 0x000F0000) >> 16;
2304
+    u32 address = reg[base].I & 0xFFFFFFFC;
2305
+    int count = 0;
2306
+    STM_ALL_2;
2307
+    clockTicks += 1 + codeTicksAccess32(armNextPC);
2308
+}
2309
+
2310
+// LDMIA Rn, {Rlist}^
2311
+static INSN_REGPARM void arm8D0(u32 opcode)
2312
+{
2313
+    if (busPrefetchCount == 0)
2314
+        busPrefetch = busPrefetchEnable;
2315
+    int base = (opcode & 0x000F0000) >> 16;
2316
+    u32 address = reg[base].I & 0xFFFFFFFC;
2317
+    int count = 0;
2318
+    LDM_ALL_2;
2319
+    LDM_ALL_2B;
2320
+    clockTicks += 2 + codeTicksAccess32(armNextPC);
2321
+}
2322
+
2323
+// STMIA Rn!, {Rlist}^
2324
+static INSN_REGPARM void arm8E0(u32 opcode)
2325
+{
2326
+    if (busPrefetchCount == 0)
2327
+        busPrefetch = busPrefetchEnable;
2328
+    int base = (opcode & 0x000F0000) >> 16;
2329
+    u32 address = reg[base].I & 0xFFFFFFFC;
2330
+    int count = 0;
2331
+    u32 temp = reg[base].I +
2332
+        4 * (cpuBitsSet[opcode & 0xFF] + cpuBitsSet[(opcode >> 8) & 255]);
2333
+    STMW_ALL_2;
2334
+    clockTicks += 1 + codeTicksAccess32(armNextPC);
2335
+}
2336
+
2337
+// LDMIA Rn!, {Rlist}^
2338
+static INSN_REGPARM void arm8F0(u32 opcode)
2339
+{
2340
+    if (busPrefetchCount == 0)
2341
+        busPrefetch = busPrefetchEnable;
2342
+    int base = (opcode & 0x000F0000) >> 16;
2343
+    u32 temp = reg[base].I +
2344
+        4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2345
+    u32 address = reg[base].I & 0xFFFFFFFC;
2346
+    int count = 0;
2347
+    LDM_ALL_2;
2348
+    if (!(opcode & (1U << base)))
2349
+        reg[base].I = temp;
2350
+    LDM_ALL_2B;
2351
+    clockTicks += 2 + codeTicksAccess32(armNextPC);
2352
+}
2353
+
2354
+// STMDB Rn, {Rlist}
2355
+static INSN_REGPARM void arm900(u32 opcode)
2356
+{
2357
+    if (busPrefetchCount == 0)
2358
+        busPrefetch = busPrefetchEnable;
2359
+    int base = (opcode & 0x000F0000) >> 16;
2360
+    u32 temp = reg[base].I -
2361
+        4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2362
+    u32 address = temp & 0xFFFFFFFC;
2363
+    int count = 0;
2364
+    STM_ALL;
2365
+    clockTicks += 1 + codeTicksAccess32(armNextPC);
2366
+}
2367
+
2368
+// LDMDB Rn, {Rlist}
2369
+static INSN_REGPARM void arm910(u32 opcode)
2370
+{
2371
+    if (busPrefetchCount == 0)
2372
+        busPrefetch = busPrefetchEnable;
2373
+    int base = (opcode & 0x000F0000) >> 16;
2374
+    u32 temp = reg[base].I -
2375
+        4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2376
+    u32 address = temp & 0xFFFFFFFC;
2377
+    int count = 0;
2378
+    LDM_ALL;
2379
+    clockTicks += 2 + codeTicksAccess32(armNextPC);
2380
+}
2381
+
2382
+// STMDB Rn!, {Rlist}
2383
+static INSN_REGPARM void arm920(u32 opcode)
2384
+{
2385
+    if (busPrefetchCount == 0)
2386
+        busPrefetch = busPrefetchEnable;
2387
+    int base = (opcode & 0x000F0000) >> 16;
2388
+    u32 temp = reg[base].I -
2389
+        4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2390
+    u32 address = temp & 0xFFFFFFFC;
2391
+    int count = 0;
2392
+    STMW_ALL;
2393
+    clockTicks += 1 + codeTicksAccess32(armNextPC);
2394
+}
2395
+
2396
+// LDMDB Rn!, {Rlist}
2397
+static INSN_REGPARM void arm930(u32 opcode)
2398
+{
2399
+    if (busPrefetchCount == 0)
2400
+        busPrefetch = busPrefetchEnable;
2401
+    int base = (opcode & 0x000F0000) >> 16;
2402
+    u32 temp = reg[base].I -
2403
+        4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2404
+    u32 address = temp & 0xFFFFFFFC;
2405
+    int count = 0;
2406
+    LDM_ALL;
2407
+    clockTicks += 2 + codeTicksAccess32(armNextPC);
2408
+    if (!(opcode & (1U << base)))
2409
+        reg[base].I = temp;
2410
+}
2411
+
2412
+// STMDB Rn, {Rlist}^
2413
+static INSN_REGPARM void arm940(u32 opcode)
2414
+{
2415
+    if (busPrefetchCount == 0)
2416
+        busPrefetch = busPrefetchEnable;
2417
+    int base = (opcode & 0x000F0000) >> 16;
2418
+    u32 temp = reg[base].I -
2419
+        4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2420
+    u32 address = temp & 0xFFFFFFFC;
2421
+    int count = 0;
2422
+    STM_ALL_2;
2423
+    clockTicks += 1 + codeTicksAccess32(armNextPC);
2424
+}
2425
+
2426
+// LDMDB Rn, {Rlist}^
2427
+static INSN_REGPARM void arm950(u32 opcode)
2428
+{
2429
+    if (busPrefetchCount == 0)
2430
+        busPrefetch = busPrefetchEnable;
2431
+    int base = (opcode & 0x000F0000) >> 16;
2432
+    u32 temp = reg[base].I -
2433
+        4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2434
+    u32 address = temp & 0xFFFFFFFC;
2435
+    int count = 0;
2436
+    LDM_ALL_2;
2437
+    LDM_ALL_2B;
2438
+    clockTicks += 2 + codeTicksAccess32(armNextPC);
2439
+}
2440
+
2441
+// STMDB Rn!, {Rlist}^
2442
+static INSN_REGPARM void arm960(u32 opcode)
2443
+{
2444
+    if (busPrefetchCount == 0)
2445
+        busPrefetch = busPrefetchEnable;
2446
+    int base = (opcode & 0x000F0000) >> 16;
2447
+    u32 temp = reg[base].I -
2448
+        4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2449
+    u32 address = temp & 0xFFFFFFFC;
2450
+    int count = 0;
2451
+    STMW_ALL_2;
2452
+    clockTicks += 1 + codeTicksAccess32(armNextPC);
2453
+}
2454
+
2455
+// LDMDB Rn!, {Rlist}^
2456
+static INSN_REGPARM void arm970(u32 opcode)
2457
+{
2458
+    if (busPrefetchCount == 0)
2459
+        busPrefetch = busPrefetchEnable;
2460
+    int base = (opcode & 0x000F0000) >> 16;
2461
+    u32 temp = reg[base].I -
2462
+        4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2463
+    u32 address = temp & 0xFFFFFFFC;
2464
+    int count = 0;
2465
+    LDM_ALL_2;
2466
+    if (!(opcode & (1U << base)))
2467
+        reg[base].I = temp;
2468
+    LDM_ALL_2B;
2469
+    clockTicks += 2 + codeTicksAccess32(armNextPC);
2470
+}
2471
+
2472
+// STMIB Rn, {Rlist}
2473
+static INSN_REGPARM void arm980(u32 opcode)
2474
+{
2475
+    if (busPrefetchCount == 0)
2476
+        busPrefetch = busPrefetchEnable;
2477
+    int base = (opcode & 0x000F0000) >> 16;
2478
+    u32 address = (reg[base].I+4) & 0xFFFFFFFC;
2479
+    int count = 0;
2480
+    STM_ALL;
2481
+    clockTicks += 1 + codeTicksAccess32(armNextPC);
2482
+}
2483
+
2484
+// LDMIB Rn, {Rlist}
2485
+static INSN_REGPARM void arm990(u32 opcode)
2486
+{
2487
+    if (busPrefetchCount == 0)
2488
+        busPrefetch = busPrefetchEnable;
2489
+    int base = (opcode & 0x000F0000) >> 16;
2490
+    u32 address = (reg[base].I+4) & 0xFFFFFFFC;
2491
+    int count = 0;
2492
+    LDM_ALL;
2493
+    clockTicks += 2 + codeTicksAccess32(armNextPC);
2494
+}
2495
+
2496
+// STMIB Rn!, {Rlist}
2497
+static INSN_REGPARM void arm9A0(u32 opcode)
2498
+{
2499
+    if (busPrefetchCount == 0)
2500
+        busPrefetch = busPrefetchEnable;
2501
+    int base = (opcode & 0x000F0000) >> 16;
2502
+    u32 address = (reg[base].I+4) & 0xFFFFFFFC;
2503
+    int count = 0;
2504
+    u32 temp = reg[base].I +
2505
+        4 * (cpuBitsSet[opcode & 0xFF] + cpuBitsSet[(opcode >> 8) & 255]);
2506
+    STMW_ALL;
2507
+    clockTicks += 1 + codeTicksAccess32(armNextPC);
2508
+}
2509
+
2510
+// LDMIB Rn!, {Rlist}
2511
+static INSN_REGPARM void arm9B0(u32 opcode)
2512
+{
2513
+    if (busPrefetchCount == 0)
2514
+        busPrefetch = busPrefetchEnable;
2515
+    int base = (opcode & 0x000F0000) >> 16;
2516
+    u32 temp = reg[base].I +
2517
+        4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2518
+    u32 address = (reg[base].I+4) & 0xFFFFFFFC;
2519
+    int count = 0;
2520
+    LDM_ALL;
2521
+    clockTicks += 2 + codeTicksAccess32(armNextPC);
2522
+    if (!(opcode & (1U << base)))
2523
+        reg[base].I = temp;
2524
+}
2525
+
2526
+// STMIB Rn, {Rlist}^
2527
+static INSN_REGPARM void arm9C0(u32 opcode)
2528
+{
2529
+    if (busPrefetchCount == 0)
2530
+        busPrefetch = busPrefetchEnable;
2531
+    int base = (opcode & 0x000F0000) >> 16;
2532
+    u32 address = (reg[base].I+4) & 0xFFFFFFFC;
2533
+    int count = 0;
2534
+    STM_ALL_2;
2535
+    clockTicks += 1 + codeTicksAccess32(armNextPC);
2536
+}
2537
+
2538
+// LDMIB Rn, {Rlist}^
2539
+static INSN_REGPARM void arm9D0(u32 opcode)
2540
+{
2541
+    if (busPrefetchCount == 0)
2542
+        busPrefetch = busPrefetchEnable;
2543
+    int base = (opcode & 0x000F0000) >> 16;
2544
+    u32 address = (reg[base].I+4) & 0xFFFFFFFC;
2545
+    int count = 0;
2546
+    LDM_ALL_2;
2547
+    LDM_ALL_2B;
2548
+    clockTicks += 2 + codeTicksAccess32(armNextPC);
2549
+}
2550
+
2551
+// STMIB Rn!, {Rlist}^
2552
+static INSN_REGPARM void arm9E0(u32 opcode)
2553
+{
2554
+    if (busPrefetchCount == 0)
2555
+        busPrefetch = busPrefetchEnable;
2556
+    int base = (opcode & 0x000F0000) >> 16;
2557
+    u32 address = (reg[base].I+4) & 0xFFFFFFFC;
2558
+    int count = 0;
2559
+    u32 temp = reg[base].I +
2560
+        4 * (cpuBitsSet[opcode & 0xFF] + cpuBitsSet[(opcode >> 8) & 255]);
2561
+    STMW_ALL_2;
2562
+    clockTicks += 1 + codeTicksAccess32(armNextPC);
2563
+}
2564
+
2565
+// LDMIB Rn!, {Rlist}^
2566
+static INSN_REGPARM void arm9F0(u32 opcode)
2567
+{
2568
+    if (busPrefetchCount == 0)
2569
+        busPrefetch = busPrefetchEnable;
2570
+    int base = (opcode & 0x000F0000) >> 16;
2571
+    u32 temp = reg[base].I +
2572
+        4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]);
2573
+    u32 address = (reg[base].I+4) & 0xFFFFFFFC;
2574
+    int count = 0;
2575
+    LDM_ALL_2;
2576
+    if (!(opcode & (1U << base)))
2577
+        reg[base].I = temp;
2578
+    LDM_ALL_2B;
2579
+    clockTicks += 2 + codeTicksAccess32(armNextPC);
2580
+}
2581
+
2582
+// B/BL/SWI and (unimplemented) coproc support ////////////////////////////
2583
+
2584
+// B <offset>
2585
+static INSN_REGPARM void armA00(u32 opcode)
2586
+{
2587
+    int offset = opcode & 0x00FFFFFF;
2588
+    if (offset & 0x00800000)
2589
+        offset |= 0xFF000000;  // negative offset
2590
+    reg[15].I += offset<<2;
2591
+    armNextPC = reg[15].I;
2592
+    reg[15].I += 4;
2593
+    ARM_PREFETCH;
2594
+    clockTicks = codeTicksAccessSeq32(armNextPC) + 1;
2595
+    clockTicks += 2 + codeTicksAccess32(armNextPC)
2596
+                    + codeTicksAccessSeq32(armNextPC);
2597
+    busPrefetchCount = 0;
2598
+}
2599
+
2600
+// BL <offset>
2601
+static INSN_REGPARM void armB00(u32 opcode)
2602
+{
2603
+    int offset = opcode & 0x00FFFFFF;
2604
+    if (offset & 0x00800000)
2605
+        offset |= 0xFF000000;  // negative offset
2606
+    reg[14].I = reg[15].I - 4;
2607
+    reg[15].I += offset<<2;
2608
+    armNextPC = reg[15].I;
2609
+    reg[15].I += 4;
2610
+    ARM_PREFETCH;
2611
+    clockTicks = codeTicksAccessSeq32(armNextPC) + 1;
2612
+    clockTicks += 2 + codeTicksAccess32(armNextPC)
2613
+                    + codeTicksAccessSeq32(armNextPC);
2614
+    busPrefetchCount = 0;
2615
+}
2616
+
2617
+
2618
+#ifdef GP_SUPPORT
2619
+// MRC
2620
+static INSN_REGPARM void armE01(u32 opcode)
2621
+{
2622
+}
2623
+#else
2624
+ #define armE01 armUnknownInsn
2625
+#endif
2626
+
2627
+
2628
+// SWI <comment>
2629
+static INSN_REGPARM void armF00(u32 opcode)
2630
+{
2631
+    clockTicks = codeTicksAccessSeq32(armNextPC) + 1;
2632
+    clockTicks += 2 + codeTicksAccess32(armNextPC)
2633
+                    + codeTicksAccessSeq32(armNextPC);
2634
+    busPrefetchCount = 0;
2635
+    CPUSoftwareInterrupt(opcode & 0x00FFFFFF);
2636
+}
2637
+
2638
+// Instruction table //////////////////////////////////////////////////////
2639
+
2640
+typedef INSN_REGPARM void (*insnfunc_t)(u32 opcode);
2641
+#define REP16(insn) \
2642
+    insn,insn,insn,insn,insn,insn,insn,insn,\
2643
+    insn,insn,insn,insn,insn,insn,insn,insn
2644
+#define REP256(insn) \
2645
+    REP16(insn),REP16(insn),REP16(insn),REP16(insn),\
2646
+    REP16(insn),REP16(insn),REP16(insn),REP16(insn),\
2647
+    REP16(insn),REP16(insn),REP16(insn),REP16(insn),\
2648
+    REP16(insn),REP16(insn),REP16(insn),REP16(insn)
2649
+#define arm_UI armUnknownInsn
2650
+#ifdef BKPT_SUPPORT
2651
+ #define arm_BP armBreakpoint
2652
+#else
2653
+ #define arm_BP armUnknownInsn
2654
+#endif
2655
+static insnfunc_t armInsnTable[4096] = {
2656
+    arm000,arm001,arm002,arm003,arm004,arm005,arm006,arm007,  // 000
2657
+    arm000,arm009,arm002,arm00B,arm004,arm_UI,arm006,arm_UI,  // 008
2658
+    arm010,arm011,arm012,arm013,arm014,arm015,arm016,arm017,  // 010
2659
+    arm010,arm019,arm012,arm01B,arm014,arm01D,arm016,arm01F,  // 018
2660
+    arm020,arm021,arm022,arm023,arm024,arm025,arm026,arm027,  // 020
2661
+    arm020,arm029,arm022,arm_UI,arm024,arm_UI,arm026,arm_UI,  // 028
2662
+    arm030,arm031,arm032,arm033,arm034,arm035,arm036,arm037,  // 030
2663
+    arm030,arm039,arm032,arm_UI,arm034,arm01D,arm036,arm01F,  // 038
2664
+    arm040,arm041,arm042,arm043,arm044,arm045,arm046,arm047,  // 040
2665
+    arm040,arm_UI,arm042,arm04B,arm044,arm_UI,arm046,arm_UI,  // 048
2666
+    arm050,arm051,arm052,arm053,arm054,arm055,arm056,arm057,  // 050
2667
+    arm050,arm_UI,arm052,arm05B,arm054,arm05D,arm056,arm05F,  // 058
2668
+    arm060,arm061,arm062,arm063,arm064,arm065,arm066,arm067,  // 060
2669
+    arm060,arm_UI,arm062,arm_UI,arm064,arm_UI,arm066,arm_UI,  // 068
2670
+    arm070,arm071,arm072,arm073,arm074,arm075,arm076,arm077,  // 070
2671
+    arm070,arm_UI,arm072,arm_UI,arm074,arm05D,arm076,arm05F,  // 078
2672
+    arm080,arm081,arm082,arm083,arm084,arm085,arm086,arm087,  // 080
2673
+    arm080,arm089,arm082,arm08B,arm084,arm_UI,arm086,arm_UI,  // 088
2674
+    arm090,arm091,arm092,arm093,arm094,arm095,arm096,arm097,  // 090
2675
+    arm090,arm099,arm092,arm09B,arm094,arm09D,arm096,arm09F,  // 098
2676
+    arm0A0,arm0A1,arm0A2,arm0A3,arm0A4,arm0A5,arm0A6,arm0A7,  // 0A0
2677
+    arm0A0,arm0A9,arm0A2,arm_UI,arm0A4,arm_UI,arm0A6,arm_UI,  // 0A8
2678
+    arm0B0,arm0B1,arm0B2,arm0B3,arm0B4,arm0B5,arm0B6,arm0B7,  // 0B0
2679
+    arm0B0,arm0B9,arm0B2,arm_UI,arm0B4,arm09D,arm0B6,arm09F,  // 0B8
2680
+    arm0C0,arm0C1,arm0C2,arm0C3,arm0C4,arm0C5,arm0C6,arm0C7,  // 0C0
2681
+    arm0C0,arm0C9,arm0C2,arm0CB,arm0C4,arm_UI,arm0C6,arm_UI,  // 0C8
2682
+    arm0D0,arm0D1,arm0D2,arm0D3,arm0D4,arm0D5,arm0D6,arm0D7,  // 0D0
2683
+    arm0D0,arm0D9,arm0D2,arm0DB,arm0D4,arm0DD,arm0D6,arm0DF,  // 0D8
2684
+    arm0E0,arm0E1,arm0E2,arm0E3,arm0E4,arm0E5,arm0E6,arm0E7,  // 0E0
2685
+    arm0E0,arm0E9,arm0E2,arm_UI,arm0E4,arm_UI,arm0E6,arm_UI,  // 0E8
2686
+    arm0F0,arm0F1,arm0F2,arm0F3,arm0F4,arm0F5,arm0F6,arm0F7,  // 0F0
2687
+    arm0F0,arm0F9,arm0F2,arm_UI,arm0F4,arm0DD,arm0F6,arm0DF,  // 0F8
2688
+
2689
+    arm100,arm_UI,arm_UI,arm_UI,arm_UI,arm_UI,arm_UI,arm_UI,  // 100
2690
+    arm_UI,arm109,arm_UI,arm10B,arm_UI,arm_UI,arm_UI,arm_UI,  // 108
2691
+    arm110,arm111,arm112,arm113,arm114,arm115,arm116,arm117,  // 110
2692
+    arm110,arm_UI,arm112,arm11B,arm114,arm11D,arm116,arm11F,  // 118
2693
+    arm120,arm121,arm_UI,arm_UI,arm_UI,arm_UI,arm_UI,arm_BP,  // 120
2694
+    arm_UI,arm_UI,arm_UI,arm12B,arm_UI,arm_UI,arm_UI,arm_UI,  // 128
2695
+    arm130,arm131,arm132,arm133,arm134,arm135,arm136,arm137,  // 130
2696
+    arm130,arm_UI,arm132,arm13B,arm134,arm13D,arm136,arm13F,  // 138
2697
+    arm140,arm_UI,arm_UI,arm_UI,arm_UI,arm_UI,arm_UI,arm_UI,  // 140
2698
+    arm_UI,arm149,arm_UI,arm14B,arm_UI,arm_UI,arm_UI,arm_UI,  // 148
2699
+    arm150,arm151,arm152,arm153,arm154,arm155,arm156,arm157,  // 150
2700
+    arm150,arm_UI,arm152,arm15B,arm154,arm15D,arm156,arm15F,  // 158
2701
+    arm160,arm_UI,arm_UI,arm_UI,arm_UI,arm_UI,arm_UI,arm_UI,  // 160
2702
+    arm_UI,arm_UI,arm_UI,arm16B,arm_UI,arm_UI,arm_UI,arm_UI,  // 168
2703
+    arm170,arm171,arm172,arm173,arm174,arm175,arm176,arm177,  // 170
2704
+    arm170,arm_UI,arm172,arm17B,arm174,arm17D,arm176,arm17F,  // 178
2705
+    arm180,arm181,arm182,arm183,arm184,arm185,arm186,arm187,  // 180
2706
+    arm180,arm_UI,arm182,arm18B,arm184,arm_UI,arm186,arm_UI,  // 188
2707
+    arm190,arm191,arm192,arm193,arm194,arm195,arm196,arm197,  // 190
2708
+    arm190,arm_UI,arm192,arm19B,arm194,arm19D,arm196,arm19F,  // 198
2709
+    arm1A0,arm1A1,arm1A2,arm1A3,arm1A4,arm1A5,arm1A6,arm1A7,  // 1A0
2710
+    arm1A0,arm_UI,arm1A2,arm1AB,arm1A4,arm_UI,arm1A6,arm_UI,  // 1A8
2711
+    arm1B0,arm1B1,arm1B2,arm1B3,arm1B4,arm1B5,arm1B6,arm1B7,  // 1B0
2712
+    arm1B0,arm_UI,arm1B2,arm1BB,arm1B4,arm1BD,arm1B6,arm1BF,  // 1B8
2713
+    arm1C0,arm1C1,arm1C2,arm1C3,arm1C4,arm1C5,arm1C6,arm1C7,  // 1C0
2714
+    arm1C0,arm_UI,arm1C2,arm1CB,arm1C4,arm_UI,arm1C6,arm_UI,  // 1C8
2715
+    arm1D0,arm1D1,arm1D2,arm1D3,arm1D4,arm1D5,arm1D6,arm1D7,  // 1D0
2716
+    arm1D0,arm_UI,arm1D2,arm1DB,arm1D4,arm1DD,arm1D6,arm1DF,  // 1D8
2717
+    arm1E0,arm1E1,arm1E2,arm1E3,arm1E4,arm1E5,arm1E6,arm1E7,  // 1E0
2718
+    arm1E0,arm_UI,arm1E2,arm1EB,arm1E4,arm_UI,arm1E6,arm_UI,  // 1E8
2719
+    arm1F0,arm1F1,arm1F2,arm1F3,arm1F4,arm1F5,arm1F6,arm1F7,  // 1F0
2720
+    arm1F0,arm_UI,arm1F2,arm1FB,arm1F4,arm1FD,arm1F6,arm1FF,  // 1F8
2721
+
2722
+    REP16(arm200),REP16(arm210),REP16(arm220),REP16(arm230),  // 200
2723
+    REP16(arm240),REP16(arm250),REP16(arm260),REP16(arm270),  // 240
2724
+    REP16(arm280),REP16(arm290),REP16(arm2A0),REP16(arm2B0),  // 280
2725
+    REP16(arm2C0),REP16(arm2D0),REP16(arm2E0),REP16(arm2F0),  // 2C0
2726
+    REP16(arm_UI),REP16(arm310),REP16(arm320),REP16(arm330),  // 300
2727
+    REP16(arm_UI),REP16(arm350),REP16(arm360),REP16(arm370),  // 340
2728
+    REP16(arm380),REP16(arm390),REP16(arm3A0),REP16(arm3B0),  // 380
2729
+    REP16(arm3C0),REP16(arm3D0),REP16(arm3E0),REP16(arm3F0),  // 3C0
2730
+
2731
+    REP16(arm400),REP16(arm410),REP16(arm400),REP16(arm410),  // 400
2732
+    REP16(arm440),REP16(arm450),REP16(arm440),REP16(arm450),  // 440
2733
+    REP16(arm480),REP16(arm490),REP16(arm480),REP16(arm490),  // 480
2734
+    REP16(arm4C0),REP16(arm4D0),REP16(arm4C0),REP16(arm4D0),  // 4C0
2735
+    REP16(arm500),REP16(arm510),REP16(arm520),REP16(arm530),  // 500
2736
+    REP16(arm540),REP16(arm550),REP16(arm560),REP16(arm570),  // 540
2737
+    REP16(arm580),REP16(arm590),REP16(arm5A0),REP16(arm5B0),  // 580
2738
+    REP16(arm5C0),REP16(arm5D0),REP16(arm5E0),REP16(arm5F0),  // 5C0
2739
+
2740
+    arm600,arm_UI,arm602,arm_UI,arm604,arm_UI,arm606,arm_UI,  // 600
2741
+    arm600,arm_UI,arm602,arm_UI,arm604,arm_UI,arm606,arm_UI,  // 608
2742
+    arm610,arm_UI,arm612,arm_UI,arm614,arm_UI,arm616,arm_UI,  // 610
2743
+    arm610,arm_UI,arm612,arm_UI,arm614,arm_UI,arm616,arm_UI,  // 618
2744
+    arm600,arm_UI,arm602,arm_UI,arm604,arm_UI,arm606,arm_UI,  // 620
2745
+    arm600,arm_UI,arm602,arm_UI,arm604,arm_UI,arm606,arm_UI,  // 628
2746
+    arm610,arm_UI,arm612,arm_UI,arm614,arm_UI,arm616,arm_UI,  // 630
2747
+    arm610,arm_UI,arm612,arm_UI,arm614,arm_UI,arm616,arm_UI,  // 638
2748
+    arm640,arm_UI,arm642,arm_UI,arm644,arm_UI,arm646,arm_UI,  // 640
2749
+    arm640,arm_UI,arm642,arm_UI,arm644,arm_UI,arm646,arm_UI,  // 648
2750
+    arm650,arm_UI,arm652,arm_UI,arm654,arm_UI,arm656,arm_UI,  // 650
2751
+    arm650,arm_UI,arm652,arm_UI,arm654,arm_UI,arm656,arm_UI,  // 658
2752
+    arm640,arm_UI,arm642,arm_UI,arm644,arm_UI,arm646,arm_UI,  // 660
2753
+    arm640,arm_UI,arm642,arm_UI,arm644,arm_UI,arm646,arm_UI,  // 668
2754
+    arm650,arm_UI,arm652,arm_UI,arm654,arm_UI,arm656,arm_UI,  // 670
2755
+    arm650,arm_UI,arm652,arm_UI,arm654,arm_UI,arm656,arm_UI,  // 678
2756
+    arm680,arm_UI,arm682,arm_UI,arm684,arm_UI,arm686,arm_UI,  // 680
2757
+    arm680,arm_UI,arm682,arm_UI,arm684,arm_UI,arm686,arm_UI,  // 688
2758
+    arm690,arm_UI,arm692,arm_UI,arm694,arm_UI,arm696,arm_UI,  // 690
2759
+    arm690,arm_UI,arm692,arm_UI,arm694,arm_UI,arm696,arm_UI,  // 698
2760
+    arm680,arm_UI,arm682,arm_UI,arm684,arm_UI,arm686,arm_UI,  // 6A0
2761
+    arm680,arm_UI,arm682,arm_UI,arm684,arm_UI,arm686,arm_UI,  // 6A8
2762
+    arm690,arm_UI,arm692,arm_UI,arm694,arm_UI,arm696,arm_UI,  // 6B0
2763
+    arm690,arm_UI,arm692,arm_UI,arm694,arm_UI,arm696,arm_UI,  // 6B8
2764
+    arm6C0,arm_UI,arm6C2,arm_UI,arm6C4,arm_UI,arm6C6,arm_UI,  // 6C0
2765
+    arm6C0,arm_UI,arm6C2,arm_UI,arm6C4,arm_UI,arm6C6,arm_UI,  // 6C8
2766
+    arm6D0,arm_UI,arm6D2,arm_UI,arm6D4,arm_UI,arm6D6,arm_UI,  // 6D0
2767
+    arm6D0,arm_UI,arm6D2,arm_UI,arm6D4,arm_UI,arm6D6,arm_UI,  // 6D8
2768
+    arm6C0,arm_UI,arm6C2,arm_UI,arm6C4,arm_UI,arm6C6,arm_UI,  // 6E0
2769
+    arm6C0,arm_UI,arm6C2,arm_UI,arm6C4,arm_UI,arm6C6,arm_UI,  // 6E8
2770
+    arm6D0,arm_UI,arm6D2,arm_UI,arm6D4,arm_UI,arm6D6,arm_UI,  // 6F0
2771
+    arm6D0,arm_UI,arm6D2,arm_UI,arm6D4,arm_UI,arm6D6,arm_UI,  // 6F8
2772
+
2773
+    arm700,arm_UI,arm702,arm_UI,arm704,arm_UI,arm706,arm_UI,  // 700
2774
+    arm700,arm_UI,arm702,arm_UI,arm704,arm_UI,arm706,arm_UI,  // 708
2775
+    arm710,arm_UI,arm712,arm_UI,arm714,arm_UI,arm716,arm_UI,  // 710
2776
+    arm710,arm_UI,arm712,arm_UI,arm714,arm_UI,arm716,arm_UI,  // 718
2777
+    arm720,arm_UI,arm722,arm_UI,arm724,arm_UI,arm726,arm_UI,  // 720
2778
+    arm720,arm_UI,arm722,arm_UI,arm724,arm_UI,arm726,arm_UI,  // 728
2779
+    arm730,arm_UI,arm732,arm_UI,arm734,arm_UI,arm736,arm_UI,  // 730
2780
+    arm730,arm_UI,arm732,arm_UI,arm734,arm_UI,arm736,arm_UI,  // 738
2781
+    arm740,arm_UI,arm742,arm_UI,arm744,arm_UI,arm746,arm_UI,  // 740
2782
+    arm740,arm_UI,arm742,arm_UI,arm744,arm_UI,arm746,arm_UI,  // 748
2783
+    arm750,arm_UI,arm752,arm_UI,arm754,arm_UI,arm756,arm_UI,  // 750
2784
+    arm750,arm_UI,arm752,arm_UI,arm754,arm_UI,arm756,arm_UI,  // 758
2785
+    arm760,arm_UI,arm762,arm_UI,arm764,arm_UI,arm766,arm_UI,  // 760
2786
+    arm760,arm_UI,arm762,arm_UI,arm764,arm_UI,arm766,arm_UI,  // 768
2787
+    arm770,arm_UI,arm772,arm_UI,arm774,arm_UI,arm776,arm_UI,  // 770
2788
+    arm770,arm_UI,arm772,arm_UI,arm774,arm_UI,arm776,arm_UI,  // 778
2789
+    arm780,arm_UI,arm782,arm_UI,arm784,arm_UI,arm786,arm_UI,  // 780
2790
+    arm780,arm_UI,arm782,arm_UI,arm784,arm_UI,arm786,arm_UI,  // 788
2791
+    arm790,arm_UI,arm792,arm_UI,arm794,arm_UI,arm796,arm_UI,  // 790
2792
+    arm790,arm_UI,arm792,arm_UI,arm794,arm_UI,arm796,arm_UI,  // 798
2793
+    arm7A0,arm_UI,arm7A2,arm_UI,arm7A4,arm_UI,arm7A6,arm_UI,  // 7A0
2794
+    arm7A0,arm_UI,arm7A2,arm_UI,arm7A4,arm_UI,arm7A6,arm_UI,  // 7A8
2795
+    arm7B0,arm_UI,arm7B2,arm_UI,arm7B4,arm_UI,arm7B6,arm_UI,  // 7B0
2796
+    arm7B0,arm_UI,arm7B2,arm_UI,arm7B4,arm_UI,arm7B6,arm_UI,  // 7B8
2797
+    arm7C0,arm_UI,arm7C2,arm_UI,arm7C4,arm_UI,arm7C6,arm_UI,  // 7C0
2798
+    arm7C0,arm_UI,arm7C2,arm_UI,arm7C4,arm_UI,arm7C6,arm_UI,  // 7C8
2799
+    arm7D0,arm_UI,arm7D2,arm_UI,arm7D4,arm_UI,arm7D6,arm_UI,  // 7D0
2800
+    arm7D0,arm_UI,arm7D2,arm_UI,arm7D4,arm_UI,arm7D6,arm_UI,  // 7D8
2801
+    arm7E0,arm_UI,arm7E2,arm_UI,arm7E4,arm_UI,arm7E6,arm_UI,  // 7E0
2802
+    arm7E0,arm_UI,arm7E2,arm_UI,arm7E4,arm_UI,arm7E6,arm_UI,  // 7E8
2803
+    arm7F0,arm_UI,arm7F2,arm_UI,arm7F4,arm_UI,arm7F6,arm_UI,  // 7F0
2804
+    arm7F0,arm_UI,arm7F2,arm_UI,arm7F4,arm_UI,arm7F6,arm_BP,  // 7F8
2805
+
2806
+    REP16(arm800),REP16(arm810),REP16(arm820),REP16(arm830),  // 800
2807
+    REP16(arm840),REP16(arm850),REP16(arm860),REP16(arm870),  // 840
2808
+    REP16(arm880),REP16(arm890),REP16(arm8A0),REP16(arm8B0),  // 880
2809
+    REP16(arm8C0),REP16(arm8D0),REP16(arm8E0),REP16(arm8F0),  // 8C0
2810
+    REP16(arm900),REP16(arm910),REP16(arm920),REP16(arm930),  // 900
2811
+    REP16(arm940),REP16(arm950),REP16(arm960),REP16(arm970),  // 940
2812
+    REP16(arm980),REP16(arm990),REP16(arm9A0),REP16(arm9B0),  // 980
2813
+    REP16(arm9C0),REP16(arm9D0),REP16(arm9E0),REP16(arm9F0),  // 9C0
2814
+
2815
+    REP256(armA00),                                           // A00
2816
+    REP256(armB00),                                           // B00
2817
+    REP256(arm_UI),                                           // C00
2818
+    REP256(arm_UI),                                           // D00
2819
+
2820
+    arm_UI,armE01,arm_UI,armE01,arm_UI,armE01,arm_UI,armE01,  // E00
2821
+    arm_UI,armE01,arm_UI,armE01,arm_UI,armE01,arm_UI,armE01,  // E08
2822
+    arm_UI,armE01,arm_UI,armE01,arm_UI,armE01,arm_UI,armE01,  // E10
2823
+    arm_UI,armE01,arm_UI,armE01,arm_UI,armE01,arm_UI,armE01,  // E18
2824
+    REP16(arm_UI),                                            // E20
2825
+    REP16(arm_UI),                                            // E30
2826
+    REP16(arm_UI),REP16(arm_UI),REP16(arm_UI),REP16(arm_UI),  // E40
2827
+    REP16(arm_UI),REP16(arm_UI),REP16(arm_UI),REP16(arm_UI),  // E80
2828
+    REP16(arm_UI),REP16(arm_UI),REP16(arm_UI),REP16(arm_UI),  // EC0
2829
+
2830
+    REP256(armF00),                                           // F00
2831
+};
2832
+
2833
+// Wrapper routine (execution loop) ///////////////////////////////////////
2834
+
2835
+#if 0
2836
+#include<time.h>
2837
+static void tester(void) {
2838
+  static int ran=0;if(ran)return;ran=1;
2839
+  FILE*f=fopen("p:\\timing.txt","w");if(!f)return;
2840
+  for (int op=/*0*/9; op</*0xF00*/10;op++){if(armInsnTable[op]==arm_UI)continue;
2841
+    int i;for(i=0;i<op;i++)if(armInsnTable[op]==armInsnTable[i])break;if(i<op)continue;
2842
+    for(i=0;i<16;i++)reg[i].I=0x3100000;
2843
+    clock_t s=clock();for(i=0;i<10000000;i++)armInsnTable[op](0);clock_t e=clock();
2844
+    fprintf(f,"arm%03X %6ld\n",op,e-s);fflush(f);
2845
+  }fclose(f);
2846
+}
2847
+#endif
2848
+
2849
+int armExecute()
2850
+{
2851
+    do {
2852
+		/*if( cheatsEnabled ) {
2853
+			cpuMasterCodeCheck();
2854
+		}*/
2855
+
2856
+        if ((armNextPC & 0x0803FFFF) == 0x08020000)
2857
+          busPrefetchCount = 0x100;
2858
+
2859
+        u32 opcode = cpuPrefetch[0];
2860
+        cpuPrefetch[0] = cpuPrefetch[1];
2861
+
2862
+        busPrefetch = false;
2863
+        if (busPrefetchCount & 0xFFFFFE00)
2864
+            busPrefetchCount = 0x100 | (busPrefetchCount & 0xFF);
2865
+
2866
+        clockTicks = 0;
2867
+        int oldArmNextPC = armNextPC;
2868
+
2869
+#ifndef FINAL_VERSION
2870
+        if (armNextPC == stop) {
2871
+            armNextPC++;
2872
+        }
2873
+#endif
2874
+
2875
+        armNextPC = reg[15].I;
2876
+        reg[15].I += 4;
2877
+        ARM_PREFETCH_NEXT;
2878
+
2879
+        int cond = opcode >> 28;
2880
+        bool cond_res = true;
2881
+        if (UNLIKELY(cond != 0x0E)) {  // most opcodes are AL (always)
2882
+            switch(cond) {
2883
+              case 0x00: // EQ
2884
+                cond_res = Z_FLAG;
2885
+                break;
2886
+              case 0x01: // NE
2887
+                cond_res = !Z_FLAG;
2888
+                break;
2889
+              case 0x02: // CS
2890
+                cond_res = C_FLAG;
2891
+                break;
2892
+              case 0x03: // CC
2893
+                cond_res = !C_FLAG;
2894
+                break;
2895
+              case 0x04: // MI
2896
+                cond_res = N_FLAG;
2897
+                break;
2898
+              case 0x05: // PL
2899
+                cond_res = !N_FLAG;
2900
+                break;
2901
+              case 0x06: // VS
2902
+                cond_res = V_FLAG;
2903
+                break;
2904
+              case 0x07: // VC
2905
+                cond_res = !V_FLAG;
2906
+                break;
2907
+              case 0x08: // HI
2908
+                cond_res = C_FLAG && !Z_FLAG;
2909
+                break;
2910
+              case 0x09: // LS
2911
+                cond_res = !C_FLAG || Z_FLAG;
2912
+                break;
2913
+              case 0x0A: // GE
2914
+                cond_res = N_FLAG == V_FLAG;
2915
+                break;
2916
+              case 0x0B: // LT
2917
+                cond_res = N_FLAG != V_FLAG;
2918
+                break;
2919
+              case 0x0C: // GT
2920
+                cond_res = !Z_FLAG &&(N_FLAG == V_FLAG);
2921
+                break;
2922
+              case 0x0D: // LE
2923
+                cond_res = Z_FLAG || (N_FLAG != V_FLAG);
2924
+                break;
2925
+              case 0x0E: // AL (impossible, checked above)
2926
+                cond_res = true;
2927
+                break;
2928
+              case 0x0F:
2929
+              default:
2930
+                // ???
2931
+                cond_res = false;
2932
+                break;
2933
+            }
2934
+        }
2935
+
2936
+        if (cond_res)
2937
+            (*armInsnTable[((opcode>>16)&0xFF0) | ((opcode>>4)&0x0F)])(opcode);
2938
+#ifdef INSN_COUNTER
2939
+        count(opcode, cond_res);
2940
+#endif
2941
+        if (clockTicks < 0)
2942
+            return 0;
2943
+        if (clockTicks == 0)
2944
+            clockTicks = 1 + codeTicksAccessSeq32(oldArmNextPC);
2945
+        cpuTotalTicks += clockTicks;
2946
+
2947
+    } while (cpuTotalTicks<cpuNextEvent && armState && !holdState && !SWITicks);
2948
+
2949
+    return 1;
2950
+}