OpenCores
URL https://opencores.org/ocsvn/arm4u/arm4u/trunk

Subversion Repositories arm4u

[/] [arm4u/] [trunk/] [test_program/] [arm_test.s] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 Bregalad
@ This file is part of ARM4U CPU
2
@
3
@ This is a creation of the Laboratory of Processor Architecture
4
@ of Ecole Polytechnique Fédérale de Lausanne ( http://lap.epfl.ch )
5
@
6
@ asm_test.s ---  Test program which uses all the instruction set
7
@                 to be assembled with GCC assembler
8
@
9
@ Written By -  Jonathan Masur and Xavier Jimenez (2013)
10
@
11
@ This program is free software; you can redistribute it and/or modify it
12
@ under the terms of the GNU General Public License as published by the
13
@ Free Software Foundation; either version 2, or (at your option) any
14
@ later version.
15
@
16
@ This program is distributed in the hope that it will be useful,
17
@ but WITHOUT ANY WARRANTY; without even the implied warranty of
18
@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19
@ GNU General Public License for more details.
20
@
21
@ In other words, you are welcome to use, share and improve this program.
22
@ You are forbidden to forbid anyone else to use, share and improve2
23
@ what you give them.   Help stamp out software-hoarding!
24
 
25
        .text
26
        .global test_cond, test_fwd, test_bshift, test_logic, test_adder, test_bshift_reg, test_load
27
        .global test_store, test_byte, test_cpsr, test_mul, test_ldmstm, test_r15jumps, test_rti
28
 
29
_start:
30
        bl test_cond
31
fail1:
32
        teq r0, #0
33
        bne fail1
34
 
35
        bl test_fwd
36
fail2:
37
        teq r0, #0
38
        bne fail2
39
 
40
        bl test_bshift
41
fail3:
42
        teq r0, #0
43
        bne fail3
44
 
45
        bl test_logic
46
fail4:
47
        teq r0, #0
48
        bne fail4
49
 
50
        bl test_adder
51
fail5:
52
        teq r0, #0
53
        bne fail5
54
 
55
        bl test_bshift_reg
56
fail6:
57
        teq r0, #0
58
        bne fail6
59
 
60
        bl test_load
61
fail7:
62
        teq r0, #0
63
        bne fail7
64
 
65
        bl test_store
66
fail8:
67
        teq r0, #0
68
        bne fail8
69
 
70
        bl test_byte
71
fail9:
72
        teq r0, #0
73
        bne fail9
74
 
75
        bl test_cpsr
76
fail10:
77
        teq r0, #0
78
        bne fail10
79
 
80
        bl test_mul
81
fail11:
82
        teq r0, #0
83
        bne fail11
84
 
85
        bl test_ldmstm
86
fail12:
87
        teq r0, #0
88
        bne fail12
89
 
90
        bl test_r15jumps
91
fail13:
92
        teq r0, #0
93
        bne fail13
94
 
95
        bl test_rti
96
passed:
97
        b passed
98
 
99
        @test N and Z flags conditional execution
100
test_cond:
101
        mov r0, #1
102
 
103
        @ test 1 - test that the Z flag is set properly, and N flag clear properly
104
        movs r5, #0
105
        bne fail
106
        bmi fail
107
        add r0, #1
108
 
109
        @test 2 - test that an instruction without 'S' does not affect the flags
110
        movs r5, #1
111
        mov r5, #0
112
        beq fail
113
        bmi fail
114
        add r0, #1
115
 
116
        @test 3 - test that the N flag is set properly
117
        movs r5, #-2
118
        mov r5, #0
119
        beq fail
120
        bpl fail
121
        add r0, #1
122
 
123
        @test4 - make sure conditional MOV are skipped, and that flags are not updated on a skipped instruction
124
        movs r5, #1
125
        movpls r5, #0    @valid
126
        movnes r5, #1   @invalid
127
        movmis r5, #2   @invalid
128
        bne fail
129
        cmp r5, #0
130
        bne fail
131
        add r0, #1
132
 
133
        @ test 5 - make sure instructions after a branch are skipped completely
134
        b .dummy
135
        movs r5, #-1
136
        movs r5, #-2
137
        movs r5, #-3
138
.dummy:
139
        bne fail
140
        bmi fail
141
 
142
        @condition test passed
143
        mov r0, #0
144
fail:
145
        bx lr
146
 
147
test_fwd:
148
        mov r0, #1
149
 
150
        @test forwarding and register file for OPA
151
        mov r1, #1
152
        add r1, r1, #1
153
        add r1, r1, #1
154
        add r1, r1, #1
155
        add r1, r1, #1
156
        add r1, r1, #1
157
        cmp r1, #6
158
        bne fail
159
        add r0, #1
160
 
161
        @test forwarding priority for opb
162
        mov r1, #1
163
        mov r1, #2
164
        mov r1, #3
165
        mov r1, #4
166
        mov r1, #5
167
        cmp r1, #5
168
        bne fail
169
        add r0, #1
170
 
171
        @forwarding test passed
172
        mov r0, #0
173
        bx lr
174
 
175
test_bshift:
176
        @test barrel shifter all modes (shift by literal const. only for now)
177
        mov r0, #1
178
 
179
        @test 1 - test LSL output
180
        movs r5, #0xf0000000
181
        mov r1, #0x0f
182
        mov r2, r1, lsl #28
183
        cmp r5, r2
184
        bne fail
185
        add r0, #1
186
 
187
        @test 2 - test ROR output
188
        mov r3, r1, ror #4
189
        cmp r5, r3
190
        bne fail
191
        add r0, #1
192
 
193
        @test 3 - test LSR output
194
        mov r4, r5, lsr #28
195
        cmp r4, r1
196
        bne fail
197
        add r0, #1
198
 
199
        @test 4 - test ASR output
200
        mov r1, #0x80000000
201
        mov r2, r1, asr #3
202
        cmp r5 ,r2
203
        bne fail
204
        add r0, #1
205
 
206
        @test 5 - test RRX output and carry
207
        mov r1, #1
208
        movs r1, r1, rrx
209
        bcc fail
210
        movs r1, r1, rrx
211
        beq fail
212
        bcs fail
213
        add r0, #1
214
 
215
        @test 6 - test carry output from rotated constant
216
        movs r5, #0xf0000000
217
        bcc fail
218
        movs r5, #0xf
219
        bcc fail
220
        movs r5, #0x100
221
        bcs fail
222
        add r0, #1
223
 
224
        @test 7 - test carry output from LSL
225
        mov r5, #0x1
226
        movs r5, r5, lsl #1
227
        bcs fail
228
        mov r5, #0x80000000
229
        movs r5, r5, lsl #1
230
        bcc fail
231
        add r0, #1
232
 
233
        @test 8 - test carry output from LSR
234
        mov r5, #2
235
        movs r5, r5, lsr #1
236
        bcs fail
237
        movs r5, r5, lsr #1
238
        bcc fail
239
        bne fail
240
        add r0, #1
241
 
242
        @test 9 - test carry output from ASR
243
        mvn r5, #0x01
244
        movs r5, r5, asr #1
245
        bcs fail
246
        movs r5, r5, asr #1
247
        bcc fail
248
        add r0, #1
249
 
250
        @test 10 - check for LSR #32 to behave correctly
251
        mov r1, #0xa5000000
252
        mvn r2, r1
253
        lsrs r3, r1, #32
254
        bcc fail
255
        lsrs r3, r2, #32
256
        bcs fail
257
        add r0, #1
258
 
259
        @test 11 - check for ASR #32 to behave correctly
260
        asrs r3, r1, #32
261
        bcc fail
262
        cmp r3, #-1
263
        bne fail
264
        asrs r3, r2, #32
265
        bcs fail
266
        bne fail
267
 
268
        @barrelshift test passed
269
        mov r0, #0
270
        bx lr
271
 
272
        @test logical operations
273
test_logic:
274
        mov r0, #1
275
 
276
        @test 1 - NOT operation
277
        mov r5, #-1
278
        mvns r5, r5
279
        bne fail
280
        add r0, #1
281
 
282
        @test 2 - AND operation
283
        mov r5, #0xa0
284
        mov r1, #0x0b
285
        mov r2, #0xab
286
        mov r3, #0xba
287
 
288
        ands r4, r5, r1
289
        bne fail
290
        ands r4, r5, r2
291
        cmp r4, r5
292
        bne fail
293
        add r0, #1
294
 
295
        @test 3 - ORR and EOR operations
296
        orr r4, r5, r1
297
        eors r4, r2, r4
298
        bne fail
299
        orr r4, r1, r5
300
        teq     r4, r2
301
        bne fail
302
        add r0, #1
303
 
304
        @test 4 - TST opcode
305
        tst r1, r5
306
        bne fail
307
        tst r4, r2
308
        beq fail
309
        add r0, #1
310
 
311
        @test 5 - BIC opcode
312
        bics r4, r2, r3
313
        cmp r4, #1
314
        bne fail
315
 
316
        @logical test passed
317
        mov r0, #0
318
        bx lr
319
 
320
        @test adder, substracter, C and V flags
321
test_adder:
322
        mov r0, #1
323
 
324
        @test 1 - check for carry when adding
325
        mov r5, #0xf0000000
326
        mvn r1, r5                      @0x0fffffff
327
        adds r2, r1, r5
328
        bcs fail
329
        bvs fail
330
 
331
        adds r2, #1
332
        bcc fail
333
        bvs fail
334
 
335
        adc r2, #120
336
        cmp r2, #121
337
        bne fail
338
        bvs fail
339
        add r0, #1
340
 
341
        @test 2 - check for overflow when adding
342
        mov r3, #0x8fffffff             @two large negative numbers become positive
343
        adds r3, r5
344
        bvc fail
345
        bcc fail
346
        bmi fail
347
 
348
        mov r3, #0x10000000
349
        adds r3, r1                             @r3 = 0x1fffffff
350
        bvs fail
351
        bcs fail
352
 
353
        adds r3, #0x60000001    @two large positive numbers become negative
354
        bvc fail
355
        bpl fail
356
 
357
        add r0, #1
358
 
359
        @test 3 - check for carry when substracting
360
        mov r5, #0x10000000
361
        subs r2, r5, r1
362
        bcc fail
363
        bvs fail
364
 
365
        subs r2, #1
366
        bcc fail
367
        bvs fail
368
 
369
        subs r2, #1
370
        bcs fail
371
        bvs fail
372
 
373
        add r0, #1
374
 
375
        @test 4 - check for overflow when substracting
376
        mov r3, #0x90000000
377
        subs r3, r5
378
        bvs fail
379
        bcc fail
380
 
381
        subs r3, #1             @substract a positive num from a large negative make the result positive
382
        bvc fail
383
        bcc fail
384
 
385
        @test 5 - check for carry when reverse substracting
386
        mov r3, #1
387
        rsbs r2, r1, r5
388
        bcc fail
389
        bvs fail
390
        rsbs r2, r3, r2
391
        bcc fail
392
        bvs fail
393
        rscs r2, r3, r2
394
        bcs fail
395
        bvs fail
396
 
397
        add r0, #1
398
 
399
        @test 6 - check for overflow when reverse substracting
400
        mov r2, #0x80000000
401
        mov r1, #-1
402
        rsbs r2, r1
403
        bvs fail
404
        bmi fail
405
        bcc fail
406
 
407
        mov r0, #0
408
        bx lr
409
 
410
@test barrelshift with register controler rotates
411
test_bshift_reg:
412
        mov r0, #1
413
 
414
        mov r1, #0
415
        mov r2, #7
416
        mov r3, #32
417
        mov r4, #33
418
        mov r5, #127
419
        mov r6, #256
420
        add r7, r6, #7
421
        mov r8, #0xff000000
422
 
423
        @test 1 LSL mode with register shift
424
        movs r9, r8, lsl r2
425
        bpl fail
426
        bcc fail
427
        @make sure lsl #0 does not affect carry
428
        movs r9, r2, lsl r1
429
        bcc fail
430
        @test using the same register twice
431
        mov r9, r2, lsl r2
432
        cmp r9, #0x380
433
        bne fail
434
 
435
        add r0, #1
436
 
437
        @test 2 - LSL mode with barrelshift > 31
438
        movs r9, r2, lsl r3
439
        bcc fail
440
        bne fail
441
        movs r9, r2, lsl r4
442
        bcs fail
443
        bne fail
444
        add r0, #1
445
 
446
        @test 3 - LSL mode with barrelshift >= 256 (only 8 bits used)
447
        movs r9, r2, lsl r6
448
        bcs fail
449
        cmp r9, #7
450
        bne fail
451
 
452
        mov r9, r2, lsl r7
453
        cmp r9, #0x380
454
        bne fail
455
 
456
        movs r9, r8, lsl r7
457
        bpl fail
458
        bcc fail
459
 
460
        add r0, #1
461
 
462
        @test 4 - LSR mode with register shift
463
        mov r2, #4
464
        add r7, r6, #4
465
 
466
        movs r9, r8, lsr r2
467
        bmi fail
468
        bcs fail
469
        @make sure lsr #0 does not affect carry
470
        movs r9, r2, lsr r1
471
        bcs fail
472
        cmp r9, #4
473
        bne fail
474
 
475
        movs r9, r8, lsr r2
476
        bcs fail
477
        cmp r9, #0xff00000
478
        bne fail
479
 
480
        add r0, #1
481
 
482
        @test 5 - LSR mode with barrelshift > 31
483
        movs r9, r8, lsr r3
484
        bcc fail
485
        bne fail
486
        movs r9, r8, lsr r4
487
        bcs fail
488
        bne fail
489
        add r0, #1
490
 
491
        @test 6 - LSR mode with barrelshift >= 256 (only 8 bits used)
492
        movs r9, r8, lsr r6
493
        bcs fail
494
        cmp r9, #0xff000000
495
        bne fail
496
 
497
        movs r9, r8, lsr r7
498
        cmp r9, #0xff00000
499
        bne fail
500
 
501
        mov r0, #0
502
        bx lr
503
 
504
array:
505
        .word 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
506
array2:
507
        .word 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31
508
 
509
test_load:
510
        mov r0, #1
511
 
512
        @ Test1 basic load operations
513
        ldr r1, .larray1
514
        ldr r2, .larray2
515
 
516
        ldr r3, [r1]
517
        teq r3, #0
518
        bne fail
519
 
520
        ldr r3, [r2]
521
        teq r3, #16
522
        bne fail
523
        add r0, #1
524
 
525
        @ Test 2 load operations with offsets
526
        ldr r3, [r2, #-60]
527
        teq r3, #1
528
        bne fail
529
 
530
        ldr r3, [r1, #20]
531
        teq r3, #5
532
        bne fail
533
        add r0, #1
534
 
535
        @ Test 3 - test positive register offset addressing
536
        mov r3, #124
537
.lloop:
538
        ldr r4, [r1, r3]
539
        cmp r4, r3, lsr #2
540
        bne fail
541
        subs r3, #4
542
        bpl .lloop
543
        add r0, #1
544
 
545
        @ Test 4 - test negative register offset addressing
546
        mov r3, #64
547
.lloop2:
548
        ldr r4, [r2, -r3]
549
        rsb r4, #0x10
550
        cmp r4, r3, lsr #2
551
        bne fail
552
        subs r3, #4
553
        bne .lloop2
554
        add r0, #1
555
 
556
        @ Test 5 - test positive register offset addressing with shift
557
        mov r3, #0
558
.lloop3:
559
        ldr r4, [r1, r3, lsl #2]
560
        cmp r4, r3
561
        bne fail
562
        add r3, #1
563
        cmp r3, #32
564
        bne .lloop3
565
        add r0, #1
566
 
567
        @ Test 6 - test negative register offset addressing with shift
568
        mov r3, #0
569
.lloop4:
570
        ldr r4, [r2, -r3, lsl #2]
571
        rsb r4, #0x10
572
        cmp r4, r3
573
        bne fail
574
        add r3, #1
575
        cmp r3, #16
576
        bne .lloop4
577
        add r0, #1
578
 
579
        @ Test 7 - test offset with pre-increment
580
        mov r3, #31
581
        mov r5, r1
582
.lloop5:
583
        ldr r4, [r5, #4]!
584
        rsb r4, #32
585
        cmp r4, r3
586
        bne fail
587
        subs r3, #1
588
        bne .lloop5
589
        add r0, #1
590
 
591
        @ Test 8 - test offset with pre-degrement
592
        mov r3, #31
593
        add r5, r1, #128
594
.lloop6:
595
        ldr r4, [r5, #-4]!
596
        cmp r4, r3
597
        bne fail
598
        subs r3, #1
599
        bpl .lloop6
600
        add r0, #1
601
 
602
        @ Test 9 - test offset with post-increment
603
        mov r3, #32
604
        mov r5, r1
605
.lloop7:
606
        ldr r4, [r5], #4
607
        rsb r4, #32
608
        cmp r4, r3
609
        bne fail
610
        subs r3, #1
611
        bne .lloop7
612
        add r0, #1
613
 
614
        @ Test 10 - test offset with post-decrement
615
        mov r3, #31
616
        add r5, r1, #124
617
.lloop8:
618
        ldr r4, [r5], #-4
619
        cmp r3, r4
620
        bne fail
621
        subs r3, #1
622
        bpl .lloop8
623
        add r0, #1
624
 
625
        @ Test 11 - test register post-increment with a negative value
626
        mov r6, #0xfffffff0
627
        mov r5, r2
628
        mov r3, #16
629
.lloop9:
630
        ldr r4, [r5], r6, asr #2
631
        cmp r4, r3
632
        bne fail
633
        subs r3, #1
634
        bpl .lloop9
635
 
636
        mov r0, #0
637
        bx lr
638
 
639
.larray1:
640
        .word array
641
.larray2:
642
        .word array2
643
 
644
test_store:
645
        mov r0, #1
646
 
647
        @ Test 1 - test basic store opperation
648
        ldr r1, .larray1
649
        mov r2, #0x24
650
        str r2, [r1]
651
        ldr r2, [r1]
652
        cmp r2, #0x24
653
        bne fail
654
        add r0, #1
655
 
656
        @ Test 2 - check for post-increment and pre-decrement writes
657
        mov r2, #0xab
658
        mov r3, #0xbc
659
        str r2, [r1, #4]!               @ array[1] = 0xab
660
        str r3, [r1], #4                @ array[1] = 0xbc
661
        ldr r2, [r1, #-4]!              @ read 0xbc
662
        ldr r3, [r1, #-4]!              @ read 0x24
663
        cmp r3, #0x24
664
        bne fail
665
        cmp r2, #0xbc
666
        bne fail
667
        add r0, #1
668
 
669
        @ Test 3 - check for register post-increment addressing
670
        mov r2, #8
671
        mov r3, #20
672
        mov r4, r1
673
        str r2, [r4], r2
674
        str r3, [r4], r2
675
        sub r4, #16
676
        cmp r4, r1
677
        bne fail
678
        ldr r2, [r1]
679
        cmp r2, #8
680
        bne fail
681
        ldr r2, [r1, #8]
682
        cmp r2, #20
683
        bne fail
684
 
685
        mov r0, #0
686
        bx lr
687
 
688
        @ Tests byte loads and store
689
test_byte:
690
        mov r0, #1
691
 
692
        @ test 1 - test store bytes
693
        ldr r1, .larray1
694
        mov r2, #8
695
.bloop:
696
        strb r2, [r1], #1
697
        subs r2, #1
698
        bne .bloop
699
 
700
        ldr r2, .ref_words+4
701
        ldr r3, [r1, #-4]!
702
        cmp r2, r3
703
        bne fail
704
 
705
        ldr r2, .ref_words
706
        ldr r3, [r1, #-4]!
707
        cmp r2, r3
708
        bne fail
709
        add r0, #1
710
 
711
        @ test 2 - test load bytes
712
        mov r2, #8
713
.bloop2:
714
        ldrb r3, [r1], #1
715
        cmp r3, r2
716
        bne fail
717
        subs r2, #1
718
        bne .bloop2
719
 
720
        mov r0, #0
721
        bx lr
722
 
723
.ref_words:
724
        @ Table for ARMs who access bytes in a little-endian order
725
        .word 0x05060708, 0x01020304
726
 
727
        @ Table for ARMs who access bytes in a big-endian order
728
@       .word 0x08070605, 0x04030201
729
 
730
        @ Good source for flags info :
731
        @ http://blogs.arm.com/software-enablement/206-condition-codes-1-condition-flags-and-codes/
732
test_cpsr:
733
        mov r0, #1
734
 
735
        @ Test 1 - in depth test for the condition flags
736
        mrs r1, cpsr
737
        and r1, #0x000000ff
738
        msr cpsr_flg, r1
739
        @ NZCV = {0000}
740
        bvs fail
741
        bcs fail
742
        beq fail
743
        bmi fail
744
        bhi fail                @ bhi <-> bls
745
        blt fail                @ blt <-> bge
746
        ble fail                @ ble <-> bgt
747
 
748
        add r1, #0x10000000
749
        msr cpsr, r1
750
        @ NZCV = {0001}
751
        bvc fail
752
        bhi fail
753
        bge fail
754
        bgt fail
755
 
756
        add r1, #0x10000000
757
        msr cpsr, r1
758
        @ NZCV = {0010}
759
        bvs fail
760
        bcc fail
761
        bls fail
762
 
763
        add r1, #0x10000000
764
        msr cpsr, r1
765
        @ NZCV = {0011}
766
        bls fail
767
        bge fail
768
        bgt fail
769
 
770
        add r1, #0x10000000
771
        msr cpsr, r1
772
        @ NZCV = {0100}
773
        bne fail
774
        bhi fail
775
        bgt fail
776
 
777
        add r1, #0x10000000
778
        msr cpsr, r1
779
        @ NZCV = {0101}
780
        bgt fail
781
 
782
        add r1, #0x10000000
783
        msr cpsr, r1
784
        @ NZCV = {0110}
785
        bhi fail
786
 
787
        add r1, #0x20000000
788
        msr cpsr, r1
789
        @ NZCV = {1000}
790
        bpl fail
791
        bge fail
792
        bgt fail
793
 
794
        add r1, #0x10000000
795
        msr cpsr, r1
796
        @ NZCV = {1001}
797
        blt fail
798
 
799
        add r1, #0x30000000
800
        msr cpsr, r1
801
        @ NZCV = {1100}
802
        bgt fail
803
 
804
        add r0, #1
805
 
806
        @ Test 2 - test for the FIQ processor mode
807
        mov r1, r14                     @ save our link register and stack pointer
808
        mov r2, r13
809
        mov r3, #30
810
        mov r4, #40
811
        mov r5, #50
812
        mov r6, #60
813
        mov r7, #70
814
        mov r8, #80
815
        mov r9, #90
816
        mov r10, #100
817
        mov r11, #110
818
        mov r12, #120
819
        mov r13, #130
820
        mov r14, #140
821
 
822
        msr cpsr, #0xd1         @ go into FIQ mode, disable all interrupts (F and I bits set)
823
        cmp r3, #30
824
        bne .fail
825
        mov r8, #8                      @ overwrite fiq regs...
826
        mov r9, #9
827
        mov r10, #10
828
        mov r11, #11
829
        mov r12, #12
830
        mov r13, #13
831
        mov r14, #14
832
        mov r3, #3                      @ also overwrite some user regs
833
        mov r4, #4
834
        mov r5, #5
835
        mov r6, #6
836
        mov r7, #7
837
        msr cpsr, #0x10         @ back to user mode
838
        cmp r3, #3                      @ r3-7 should have been affected, but not r8-r14
839
        bne .fail
840
        cmp r4, #4
841
        bne .fail
842
        cmp r5, #5
843
        bne .fail
844
        cmp r6, #6
845
        bne .fail
846
        cmp r7, #7
847
        bne .fail
848
        cmp r8, #80
849
        bne .fail
850
        cmp r9, #90
851
        bne .fail
852
        cmp r10, #100
853
        bne .fail
854
        cmp r11, #110
855
        bne .fail
856
        cmp r12, #120
857
        bne .fail
858
        cmp r13, #130
859
        bne .fail
860
        cmp r14, #140
861
        bne .fail
862
        add r0, #1
863
 
864
 
865
        @ Test 3 - test for the SUP processor mode
866
        mov r12, #120
867
        mov r13, #130
868
        mov r14, #140
869
        msr cpsr, #0x13         @ enter SUP mode
870
        cmp r12, #120
871
        bne .fail
872
        mov r12, #12
873
        mov r13, #13
874
        mov r14, #14
875
        msr cpsr, #0x10         @ back into user mode
876
        cmp r12, #12
877
        bne .fail
878
        cmp r13, #130
879
        bne .fail
880
        cmp r14, #140
881
        bne .fail
882
        add r0, #1
883
 
884
        @ Test 4 - test for the UND processor mode
885
        mov r12, #120
886
        mov r13, #130
887
        mov r14, #140
888
        msr cpsr, #0x1b         @ enter UND mode
889
        cmp r12, #120
890
        bne .fail
891
        mov r12, #12
892
        mov r13, #13
893
        mov r14, #14
894
        msr cpsr, #0x10         @ back into user mode
895
        cmp r12, #12
896
        bne .fail
897
        cmp r13, #130
898
        bne .fail
899
        cmp r14, #140
900
        bne .fail
901
        add r0, #1
902
 
903
        @ Test 5 - test for the IRQ processor mode
904
        mov r12, #120
905
        mov r13, #130
906
        mov r14, #140
907
        msr cpsr, #0x92         @ enter IRQ mode, IRQ disabled
908
        cmp r12, #120
909
        bne .fail
910
        mov r12, #12
911
        mov r13, #13
912
        mov r14, #14
913
        msr cpsr, #0x10         @ back into user mode
914
        cmp r12, #12
915
        bne .fail
916
        cmp r13, #130
917
        bne .fail
918
        cmp r14, #140
919
        bne .fail
920
 
921
        mov r0, #0
922
 
923
.fail:
924
        msr cpsr, #0x10         @ back into user mode
925
        mov r13, r2
926
        bx r1                           @ return
927
 
928
        @ Test multiplier and how it affects the flags
929
test_mul:
930
        mov r0, #1
931
 
932
        @ Test 1 - MUL instruction
933
        mov r1, #0
934
        mov r2, #2
935
        mov r3, #3
936
        mul r4, r2, r3
937
        cmp r4, #6
938
        bne fail
939
        bmi fail
940
 
941
        muls r5, r1, r2
942
        bne fail
943
        bmi fail
944
 
945
        muls r4, r2
946
        cmp r4, #12
947
        bne fail
948
        bmi fail
949
 
950
@       mul r3, r3, r4          @ no joke, verified to fail on a real ARM !
951
@       cmp r4, #36
952
@       bne fail
953
 
954
        mov r3, #-3                     @ multiply positive * negative
955
        muls r5, r2, r3
956
        bpl fail
957
        cmp r5, #-6
958
        bne fail
959
 
960
        mov r2, #-2                     @ multiply negative * negative
961
        muls r5, r2, r3
962
        bmi fail
963
        cmp r5, #6
964
        bne fail
965
        add r0, #1
966
 
967
        @ Test 2 - MLA instruction
968
        mov r1, #10
969
        mov r2, #2
970
        mov r3, #5
971
        mlas r4, r1, r2, r3             @ 2*10 + 5 = 25
972
        bmi fail
973
@       bcs fail                        @ on a real ARM, C flag after MLA is unpredictable
974
        bvs fail
975
        cmp r4, #25
976
        bne fail
977
 
978
        mov r1, #-10
979
        mlas r4, r1, r2, r3             @ 2*-10 + 5 = -15
980
        bpl fail
981
        bvs fail
982
        cmp r4, #-15
983
        bne fail
984
 
985
        mov r3, #0x80000001             @ causes addition overflow
986
        mlas r4, r1, r2, r3
987
        bmi fail
988
@       bvc fail                        @ on a real ARM, V flag is not updated ?
989
 
990
        mov r0, #0
991
        bx lr
992
 
993
        @ Test load multiple and store multiple instructions
994
test_ldmstm:
995
        mov r0, #1
996
 
997
        @ Test 1 - STMIA
998
        mov r1, #1
999
        mov r2, #2
1000
        mov r3, #3
1001
        mov r4, #4
1002
        ldr r5, .larray1
1003
        mov r6, r5
1004
 
1005
        stmia r6!, {r1-r4}
1006
        sub r6, r5
1007
        cmp r6, #16
1008
        bne fail
1009
 
1010
        ldr r6, [r5]
1011
        cmp r6, #1
1012
        bne fail
1013
        ldr r6, [r5, #4]
1014
        cmp r6, #2
1015
        bne fail
1016
        ldr r6, [r5, #8]
1017
        cmp r6, #3
1018
        bne fail
1019
        ldr r6, [r5, #12]
1020
        cmp r6, #4
1021
        bne fail
1022
        add r0, #1
1023
 
1024
        @ Test 2 - STMIB
1025
        mov r6, r5
1026
        stmib r6!, {r1-r3}
1027
        sub r6, r5
1028
        cmp r6, #12
1029
        bne fail
1030
 
1031
        ldr r6, [r5, #4]
1032
        cmp r6, #1
1033
        bne fail
1034
        ldr r6, [r5, #8]
1035
        cmp r6, #2
1036
        bne fail
1037
        ldr r6, [r5, #12]
1038
        cmp r6, #3
1039
        bne fail
1040
        add r0, #1
1041
 
1042
        @ Test 3 - STMDB
1043
        add r6, r5, #12
1044
        stmdb r6!, {r1-r3}
1045
        cmp r6, r5
1046
        bne fail
1047
 
1048
        ldr r6, [r5]
1049
        cmp r6, #1
1050
        bne fail
1051
        ldr r6, [r5, #8]
1052
        cmp r6, #3
1053
        bne fail
1054
        add r0, #1
1055
 
1056
        @ Test 4 - STMDA
1057
        add r6, r5, #12
1058
        stmda r6!, {r1-r3}
1059
        cmp r6, r5
1060
        bne fail
1061
        ldr r6, [r5, #4]
1062
        cmp r6, #1
1063
        bne fail
1064
        ldr r6, [r5, #12]
1065
        cmp r6, #3
1066
        bne fail
1067
        add r0, #1
1068
 
1069
        @ Test 5 - LDMIA
1070
        ldr r5, .larray2
1071
        ldmia r5, {r1-r4}
1072
        cmp r1, #16
1073
        bne fail
1074
        cmp r2, #17
1075
        bne fail
1076
        cmp r3, #18
1077
        bne fail
1078
        cmp r4, #19
1079
        bne fail
1080
        add r0, #1
1081
 
1082
        @ Test 6 - LDMIB
1083
        ldmib r5!, {r1-r4}
1084
        cmp r1, #17
1085
        bne fail
1086
        cmp r2, #18
1087
        bne fail
1088
        cmp r3, #19
1089
        bne fail
1090
        cmp r4, #20
1091
        bne fail
1092
        add r0, #1
1093
 
1094
        @ Test 7 - LDMDB
1095
        ldmdb r5!, {r1-r3}
1096
        cmp r3, #19
1097
        bne fail
1098
        cmp r2, #18
1099
        bne fail
1100
        cmp r1, #17
1101
        bne fail
1102
        add r0, #1
1103
 
1104
        @ Test 8 - LDMDA
1105
        ldmda r5, {r1-r2}
1106
        cmp r1, #16
1107
        bne fail
1108
        cmp r2, #17
1109
        bne fail
1110
 
1111
        mov r0, #0
1112
        bx lr
1113
 
1114
        @ Test proper jumping on instructions that affect R15
1115
test_r15jumps:
1116
        mov r0, #1
1117
 
1118
        @ Test 1 - a standard, conditional jump instruction
1119
        ldr r3, .llabels
1120
        mov r1, #0
1121
        movs r2, #0
1122
        moveq r15, r3            @ jump to label 1
1123
        movs r2, #12
1124
        movs r1, #13            @ make sure fetched/decoded instructions do no execute
1125
.label1:
1126
        bne fail
1127
        cmp r1, #0
1128
        bne fail
1129
        cmp r2, #0
1130
        bne fail
1131
        add r0, #1
1132
 
1133
        @ Test 2 - a jump instruction is not executed
1134
        ldr r3, .llabels+4
1135
        movs r2, #12
1136
        moveq r15, r3
1137
        movs r2, #0
1138
.label2:
1139
        cmp r2, #0
1140
        bne fail
1141
        add r0, #1
1142
 
1143
        @ Test 3 - add instruction to calculate new address
1144
        ldr r3, .llabels+8
1145
        movs r1, #0
1146
        movs r2, #0
1147
        add r15, r3, #8         @go 2 instructions after label 3
1148
.label3:
1149
        movs r1, #12
1150
        movs r2, #13
1151
        bne fail                @ program executions continues here
1152
        bne fail
1153
        add r0, #1
1154
 
1155
        @ Test 4 - use an addition directly from PC+8 (r15)
1156
        movs r2, #0
1157
        movs r1, #0
1158
        add r15, r15, #4        @ Skip 2 instructions This could actually be used for a nice jump table if a register were used instead of #4
1159
        movs r1, #1
1160
        movs r2, #2
1161
        bne fail
1162
        bne fail
1163
        add r0, #1
1164
 
1165
        @ Test 5 - load r15 directly from memory
1166
        movs r1, #1
1167
        movs r2, #2
1168
        ldrne r15, .llabels+12          @ Makes sure code after a ldr r15 is not executed
1169
        movs r1, #0
1170
        movs r2, #0
1171
.label4:
1172
        beq fail
1173
        beq fail
1174
 
1175
        ldreq r15, .llabels+16          @ Makes sure everything is right when a ldr r15 is not taken
1176
        movs r2, #-2
1177
.label5:
1178
        bpl fail
1179
        cmp r2, #-2
1180
        bne fail
1181
        add r0, #1
1182
 
1183
        @ Test 6 - load r15 as the last step of a LDM instruction
1184
        ldr r3, .llabels + 6*4
1185
        movs r1, #0
1186
        movs r2, #0
1187
        ldmia r3, {r4-r8, r15}          @jump to label6
1188
        movs r1, #4
1189
        movs r2, #2
1190
.label6:
1191
        bne fail
1192
        bne fail
1193
 
1194
        mov r0, #0
1195
        bx lr
1196
 
1197
.align 8
1198
.llabels:
1199
        .word .label1, .label2, .label3, .label4, .label5, .label6, .llabels
1200
 
1201
test_rti:
1202
        mov r0, #1
1203
 
1204
        @ Test 1 - test normal RTI
1205
        msr cpsr, #0xd1                 @ enter into FIQ mode (interrupt disabled)
1206
        msr spsr, #0x40000010   @ emulate a saved CPSR in user mode, with NZCV = {0100}
1207
 
1208
        movs r8, #-12                   @ now the FIQ sets it's CPSR to NZCV = {1000}
1209
        ldr r8, .rtilabels              @ simulate an interrupt return
1210
        movs r15, r8                    @ return from interrupt and move SPSR to CPSR
1211
 
1212
.rtilabel1:
1213
        bmi .rtifail                    @ ?!? WTF !?!
1214
        bne .rtifail
1215
        add r0, #1
1216
 
1217
        @ Test 2 - test LDM instruction with S flag
1218
        msr cpsr, #0xd1
1219
        ldr r8, .rtilabels + 20
1220
        ldmib r8!, {r9, r10}            @ fiq_r9 = 1, fiq_r10 = 2
1221
        ldmib r8, {r9, r10}^            @ r8 = 3, r9 = 4 ( ^ => load to user registers )
1222
        cmp r9, #1
1223
        bne .rtifail
1224
        cmp r10, #2
1225
        bne .rtifail
1226
        msr cpsr, #0x10
1227
        cmp r9, #3
1228
        bne .rtifail
1229
        cmp r10, #4
1230
        bne .rtifail
1231
        add r0, #1
1232
 
1233
        @ Test 3 - test LDM instruction with S flag for returning from an interrupt
1234
        msr cpsr, #0xd1                         @ FIQ mode, NZCV = {0000}
1235
        msr spsr_c, #0x80000010         @ saved is normal mode with NZCV = {1000}
1236
 
1237
        ldr r8, .rtilabels + 20
1238
        add r8, #8
1239
 
1240
        movs r9, #0                                     @ NZCV = {0100}
1241
        ldmib r8, {r9-r11, r15}^        @ This should return to user mode and restore CPSR to NZCV = {1000}
1242
 
1243
.rtilabel2:
1244
        bpl .rtifail
1245
        beq .rtifail
1246
 
1247
        mov r0, #0
1248
 
1249
.rtifail:
1250
        msr cpsr, #0x10
1251
        bx lr
1252
 
1253
 
1254
.rtilabels:
1255
        .word .rtilabel1, 1, 2, 3, 4, .rtilabels, .rtilabel2

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.