summaryrefslogtreecommitdiff
path: root/debian/patches/arm-sf.patch
blob: f25215b1a0669bdd32b830db52d65ce91d6de516 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
Description: Added SF patch
 See:
 http://sourceforge.net/tracker/index.php?func=detail&aid=3529615&group_id=1355&atid=301355
Author: Tom Vijlbrief <tvijlbrief@gmail.com>

---
The information above should follow the Patch Tagging Guidelines, please
checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here
are templates for supplementary fields that you might want to add:

Origin: <vendor|upstream|other>, <url of original patch>
Bug: <url in upstream bugtracker>
Bug-Debian: http://bugs.debian.org/<bugnumber>
Bug-Ubuntu: https://launchpad.net/bugs/<bugnumber>
Forwarded: <no|not-needed|url proving that it has been forwarded>
Reviewed-By: <name and email of someone who approved the patch>
Last-Update: <YYYY-MM-DD>

--- clisp-2.49.orig/src/ariarm.d
+++ clisp-2.49/src/ariarm.d
@@ -86,7 +86,7 @@ pc      .req    r15
 
 #define C(x) x
 #define EXPORT(x) .global x
-#define GLABEL(x)  x:
+#define GLABEL(x) .type x STT_FUNC; x:
 #define LABEL(x)  x:
 #define RRX rrx
 #define END
@@ -187,7 +187,7 @@ GLABEL(mulu32_)
         LDR     a3,[pc,#ptr_mulu32_high-.-8]
         STR     a2,[a3,#0]
 #endif
-        MOVS    pc,lr
+        BX      lr
 
 /* extern uint16 divu_3216_1616_ (uint32 x, uint16 y);
        entry
@@ -243,7 +243,7 @@ GLABEL(divu_3216_1616_)
         LDR     a3,[pc,#ptr_divu_16_rest-.-8] /* save rest so can be picked up later */
         STR     a2,[a3,#0]      /* the result is 16 bits */
 #endif
-        MOVS    pc, lr
+        BX      lr
 
 /* extern uint32 divu_6432_3232_ (uint32 xhi, uint32 xlo, uint32 y); | -> Quotient q
  extern uint32 divu_32_rest;                                       | -> Rest r
@@ -278,7 +278,7 @@ GLABEL(divu_6432_3232_)
         LDR     a4,[pc,#ptr_divu_32_rest-.-8]
         STR     a2,[a4,#0]      /* divu_32_rest = remainder */
 #endif
-        LDMFD   sp!, {v1,v2,v3,v4,v5,v6,pc}^
+        LDMFD   sp!, {v1,v2,v3,v4,v5,v6,pc}
 
 LABEL(divu_6432_3232_l1)
         MOV     v3, #0          /* s = 0 */
@@ -346,7 +346,7 @@ LABEL(divu_6432_3232_l1)
         LDR     a3,[pc,#ptr_divu_32_rest-.-8]
         STR     a2,[a3,#0]          /* divu_32_rest = remainder */
 #endif
-        LDMFD   sp!, {v1,v2,v3,v4,v5,v6,pc}^
+        LDMFD   sp!, {v1,v2,v3,v4,v5,v6,pc}
 
 /* extern uintD* copy_loop_up (uintD* sourceptr, uintD* destptr, uintC count);
        entry
@@ -370,7 +370,7 @@ GLABEL(copy_loop_up)
 LABEL(copy_loop_up_l1)
         BICS    a4,a3,#3        /* set counter to multiple of 4 */
         MOVEQ   a1,a2           /* return addr of last word stored */
-        MOVEQS  pc,lr           /* if zero then we're done */
+        BXEQ    lr              /* if zero then we're done */
         STMFD   sp!,{v1,lr}     /* save work regs */
 LABEL(copy_loop_up_l2)
         LDMIA   a1!,{a3,v1,ip,lr} /* copy 4 words in one go */
@@ -380,7 +380,7 @@ LABEL(copy_loop_up_l2)
         STMGEIA a2!,{a3,v1,ip,lr} /* 4 more words */
         BGT     copy_loop_up_l2   /* and loop */
         MOV     a1,a2             /* return addr of last word stored */
-        LDMFD   sp!,{v1,pc}^      /* restore work regs and return */
+        LDMFD   sp!,{v1,pc}       /* restore work regs and return */
 
 /* extern uintD* copy_loop_down (uintD* sourceptr, uintD* destptr, uintC count);
        entry
@@ -404,7 +404,7 @@ GLABEL(copy_loop_down)
 LABEL(copy_loop_down_l1)
         BICS    a4,a3,#3        /* set counter to multiple of 4 */
         MOVEQ   a1,a2           /* return addr of last word stored */
-        MOVEQS  pc,lr           /* if zero then we're done */
+        BXEQ    lr              /* if zero then we're done */
         STMFD   sp!,{v1,lr}     /* save work regs */
 LABEL(copy_loop_down_l2)
         LDMDB   a1!,{a3,v1,ip,lr} /* copy 4 words in one go */
@@ -414,7 +414,7 @@ LABEL(copy_loop_down_l2)
         STMGEDB a2!,{a3,v1,ip,lr} /* 4 more words */
         BGT     copy_loop_down_l2 /* and loop */
         MOV     a1,a2             /* return addr of last word stored */
-        LDMFD   sp!,{v1,pc}^      /* restore work regs and return */
+        LDMFD   sp!,{v1,pc}       /* restore work regs and return */
 
 /* extern uintD* clear_loop_up (uintD* destptr, uintC count);
        entry
@@ -446,7 +446,7 @@ GLABEL(fill_loop_up)
         STRGT   a3,[a1],#4
 LABEL(fill_loop_up_l1)
         BICS    a4,a2,#3        /* set counter to multiple of 4 */
-        MOVEQS  pc,lr           /* if zero then we're done */
+        BXEQ    lr              /* if zero then we're done */
         STMFD   sp!,{v1,lr}     /* save work regs */
         MOV     v1,a3           /* copy filler to three other */
         MOV     ip,a3           /* registers */
@@ -456,7 +456,7 @@ LABEL(fill_loop_up_l2)
         SUBS    a4,a4,#8          /* decrement counter by 8 */
         STMGEIA a1!,{a3,v1,ip,lr} /* if count still positive then store 4 */
         BGT     fill_loop_up_l2   /* more and loop */
-        LDMFD   sp!,{v1,pc}^      /* restore work regs and return */
+        LDMFD   sp!,{v1,pc}       /* restore work regs and return */
 
 
 /* extern uintD* clear_loop_down (uintD* destptr, uintC count);
@@ -489,7 +489,7 @@ GLABEL(fill_loop_down)
         STRGT   a3,[a1,#-4]!
 LABEL(fill_loop_down_l1)
         BICS    a4,a2,#3        /* set counter to multiple of 4 */
-        MOVEQS  pc,lr           /* if zero then we're done */
+        BXEQ    lr              /* if zero then we're done */
         STMFD   sp!,{v1,lr}     /* save work regs */
         MOV     v1,a3           /* copy filler to three other */
         MOV     ip,a3           /* registers */
@@ -499,7 +499,7 @@ LABEL(fill_loop_down_l2)
         SUBS    a4,a4,#8          /* decrement counter by 8 */
         STMGEDB a1!,{a3,v1,ip,lr} /* if count still positive then store 4 */
         BGT     fill_loop_down_l2 /* more and loop */
-        LDMFD   sp!,{v1,pc}^      /* restore work regs and return */
+        LDMFD   sp!,{v1,pc}       /* restore work regs and return */
 
 /* extern void or_loop_up (uintD* xptr, uintD* yptr, uintC count);
        entry
@@ -529,7 +529,7 @@ GLABEL(or_loop_up)
         STRGT   ip,[a1],#4
 LABEL(or_loop_up_l1)
         BICS    a4,a3,#3        /* set counter to multiple of 4 */
-        MOVEQS  pc,lr           /* if zero then we're done */
+        BXEQ    lr              /* if zero then we're done */
         STMFD   sp!,{v1-v5,lr}  /* save work regs */
 LABEL(or_loop_up_l2)
         LDMIA   a2!,{a3,v1,v2,ip} /* load 4 words in one go */
@@ -541,7 +541,7 @@ LABEL(or_loop_up_l2)
         STMIA   a1!,{v3,v4,v5,lr} /* store 4 results */
         SUBS    a4,a4,#4          /* decrement counter by 4 */
         BGT     or_loop_up_l2   /* if count still positive then loop */
-        LDMFD   sp!,{v1-v5,pc}^ /* restore work regs and return */
+        LDMFD   sp!,{v1-v5,pc}  /* restore work regs and return */
 
 /* extern void xor_loop_up (uintD* xptr, uintD* yptr, uintC count);
        entry
@@ -571,7 +571,7 @@ GLABEL(xor_loop_up)
         STRGT   ip,[a1],#4
 LABEL(xor_loop_up_l1)
         BICS    a4,a3,#3        /* set counter to multiple of 4 */
-        MOVEQS  pc,lr           /* if zero then we're done */
+        BXEQ    lr              /* if zero then we're done */
         STMFD   sp!,{v1-v5,lr}  /* save work regs */
 LABEL(xor_loop_up_l2)
         LDMIA   a2!,{a3,v1,v2,ip} /* load 4 words in one go */
@@ -583,7 +583,7 @@ LABEL(xor_loop_up_l2)
         STMIA   a1!,{v3,v4,v5,lr} /* store 4 results */
         SUBS    a4,a4,#4          /* decrement counter by 4 */
         BGT     xor_loop_up_l2  /* if count still positive then loop */
-        LDMFD   sp!,{v1-v5,pc}^ /* restore work regs and return */
+        LDMFD   sp!,{v1-v5,pc}  /* restore work regs and return */
 
 /* extern void and_loop_up (uintD* xptr, uintD* yptr, uintC count);
        entry
@@ -613,7 +613,7 @@ GLABEL(and_loop_up)
         STRGT   ip,[a1],#4
 LABEL(and_loop_up_l1)
         BICS    a4,a3,#3        /* set counter to multiple of 4 */
-        MOVEQS  pc,lr           /* if zero then we're done */
+        BXEQ    lr              /* if zero then we're done */
         STMFD   sp!,{v1-v5,lr}  /* save work regs */
 LABEL(and_loop_up_l2)
         LDMIA   a2!,{a3,v1,v2,ip} /* load 4 words in one go */
@@ -625,7 +625,7 @@ LABEL(and_loop_up_l2)
         STMIA   a1!,{v3,v4,v5,lr} /* store 4 results */
         SUBS    a4,a4,#4          /* decrement counter by 4 */
         BGT     and_loop_up_l2  /* if count still positive then loop */
-        LDMFD   sp!,{v1-v5,pc}^ /* restore work regs and return */
+        LDMFD   sp!,{v1-v5,pc}  /* restore work regs and return */
 
 /* extern void eqv_loop_up (uintD* xptr, uintD* yptr, uintC count);
        entry
@@ -659,7 +659,7 @@ GLABEL(eqv_loop_up)
         STRGT   ip,[a1],#4
 LABEL(eqv_loop_up_l1)
         BICS    a4,a3,#3        /* set counter to multiple of 4 */
-        MOVEQS  pc,lr           /* if zero then we're done */
+        BXEQ    lr              /* if zero then we're done */
         STMFD   sp!,{v1-v5,lr}  /* save work regs */
 LABEL(eqv_loop_up_l2)
         LDMIA   a2!,{a3,v1,v2,ip} /* load 4 words in one go */
@@ -675,7 +675,7 @@ LABEL(eqv_loop_up_l2)
         STMIA   a1!,{v3,v4,v5,lr} /* store 4 results */
         SUBS    a4,a4,#4          /* decrement counter by 4 */
         BGT     eqv_loop_up_l2  /* if count still positive then loop */
-        LDMFD   sp!,{v1-v5,pc}^ /* restore work regs and return */
+        LDMFD   sp!,{v1-v5,pc}  /* restore work regs and return */
 
 /* extern void nand_loop_up (uintD* xptr, uintD* yptr, uintC count);
        entry
@@ -709,7 +709,7 @@ GLABEL(nand_loop_up)
         STRGT   ip,[a1],#4
 LABEL(nand_loop_up_l1)
         BICS    a4,a3,#3        /* set counter to multiple of 4 */
-        MOVEQS  pc,lr           /* if zero then we're done */
+        BXEQ    lr              /* if zero then we're done */
         STMFD   sp!,{v1-v5,lr}  /* save work regs */
 LABEL(nand_loop_up_l2)
         LDMIA   a2!,{a3,v1,v2,ip} /* load 4 words in one go */
@@ -725,7 +725,7 @@ LABEL(nand_loop_up_l2)
         STMIA   a1!,{v3,v4,v5,lr} /* store 4 results */
         SUBS    a4,a4,#4          /* decrement counter by 4 */
         BGT     nand_loop_up_l2 /* if count still positive then loop */
-        LDMFD   sp!,{v1-v5,pc}^ /* restore work regs and return */
+        LDMFD   sp!,{v1-v5,pc}  /* restore work regs and return */
 
 /* extern void nor_loop_up (uintD* xptr, uintD* yptr, uintC count);
        entry
@@ -759,7 +759,7 @@ GLABEL(nor_loop_up)
         STRGT   ip,[a1],#4
 LABEL(nor_loop_up_l1)
         BICS    a4,a3,#3        /* set counter to multiple of 4 */
-        MOVEQS  pc,lr           /* if zero then we're done */
+        BXEQ    lr              /* if zero then we're done */
         STMFD   sp!,{v1-v5,lr}  /* save work regs */
 LABEL(nor_loop_up_l2)
         LDMIA   a2!,{a3,v1,v2,ip} /* load 4 words in one go */
@@ -775,7 +775,7 @@ LABEL(nor_loop_up_l2)
         STMIA   a1!,{v3,v4,v5,lr} /* store 4 results */
         SUBS    a4,a4,#4          /* decrement counter by 4 */
         BGT     nor_loop_up_l2  /* if count still positive then loop */
-        LDMFD   sp!,{v1-v5,pc}^ /* restore work regs and return */
+        LDMFD   sp!,{v1-v5,pc}  /* restore work regs and return */
 
 /* extern void andc2_loop_up (uintD* xptr, uintD* yptr, uintC count);
        entry
@@ -805,7 +805,7 @@ GLABEL(andc2_loop_up)
         STRGT   ip,[a1],#4
 LABEL(andc2_loop_up_l1)
         BICS    a4,a3,#3        /* set counter to multiple of 4 */
-        MOVEQS  pc,lr           /* if zero then we're done */
+        BXEQ    lr              /* if zero then we're done */
         STMFD   sp!,{v1-v5,lr}  /* save work regs */
 LABEL(andc2_loop_up_l2)
         LDMIA   a2!,{a3,v1,v2,ip} /* load 4 words in one go */
@@ -817,7 +817,7 @@ LABEL(andc2_loop_up_l2)
         STMIA   a1!,{v3,v4,v5,lr} /* store 4 results */
         SUBS    a4,a4,#4          /* decrement counter by 4 */
         BGT     andc2_loop_up_l2 /* if count still positive then loop */
-        LDMFD   sp!,{v1-v5,pc}^  /* restore work regs and return */
+        LDMFD   sp!,{v1-v5,pc}   /* restore work regs and return */
 
 /* extern void orc2_loop_up (uintD* xptr, uintD* yptr, uintC count);
        entry
@@ -851,7 +851,7 @@ GLABEL(orc2_loop_up)
         STRGT   ip,[a1],#4
 LABEL(orc2_loop_up_l1)
         BICS    a4,a3,#3        /* set counter to multiple of 4 */
-        MOVEQS  pc,lr           /* if zero then we're done */
+        BXEQ    lr              /* if zero then we're done */
         STMFD   sp!,{v1-v5,lr}  /* save work regs */
 LABEL(orc2_loop_up_l2)
         LDMIA   a2!,{a3,v1,v2,ip} /* load 4 words in one go */
@@ -867,7 +867,7 @@ LABEL(orc2_loop_up_l2)
         STMIA   a1!,{v3,v4,v5,lr} /* store 4 results */
         SUBS    a4,a4,#4          /* decrement counter by 4 */
         BGT     orc2_loop_up_l2 /* if count still positive then loop */
-        LDMFD   sp!,{v1-v5,pc}^ /* restore work regs and return */
+        LDMFD   sp!,{v1-v5,pc}  /* restore work regs and return */
 
 /* extern void not_loop_up (uintD* xptr, uintC count);
        entry
@@ -893,7 +893,7 @@ GLABEL(not_loop_up)
         STRGT   a3,[a1],#4
 LABEL(not_loop_up_l1)
         BICS    a4,a2,#3        /* set counter to multiple of 4 */
-        MOVEQS  pc,lr           /* if zero then we're done */
+        BXEQ    lr              /* if zero then we're done */
         STMFD   sp!,{lr}        /* save work regs */
 LABEL(not_loop_up_l2)
         LDMIA   a1,{a2,a3,ip,lr} /* load 4 words in one go,NO writeback */
@@ -904,7 +904,7 @@ LABEL(not_loop_up_l2)
         STMIA   a1!,{a2,a3,ip,lr} /* store 4 results */
         SUBS    a4,a4,#4          /* decrement counter by 4 */
         BGT     not_loop_up_l2  /* if count still positive then loop */
-        LDMFD   sp!,{pc}^       /* restore work regs and return */
+        LDMFD   sp!,{pc}        /* restore work regs and return */
 
 /* extern void and_test_loop_up (uintD* xptr, uintD* yptr, uintC count);
        entry
@@ -923,13 +923,13 @@ GLABEL(and_test_loop_up)
         LDR     ip,[a1],#4      /* to align the total to a multiple */
         TST     ip,a4           /* of 4 words */
         MOVNE   a1,#1           /* return true if AND_TEST ok */
-        MOVNES  pc,lr
+        BXNE    lr
         BCC     and_test_loop_up_l1 /* better to branch than skip instrs. */
         LDRGE   a4,[a2],#4
         LDRGE   ip,[a1],#4
         TSTGE   ip,a4
         MOVNE   a1,#1
-        MOVNES  pc,lr
+        BXNE    lr
         ANDS    a4,a3,#3
         CMP     a4,#2
         BLE     and_test_loop_up_l1 /* better to branch than skip instrs. */
@@ -937,11 +937,11 @@ GLABEL(and_test_loop_up)
         LDRGT   ip,[a1],#4
         TSTGT   ip,a4
         MOVNE   a1,#1
-        MOVNES  pc,lr
+        BXNE    lr
 LABEL(and_test_loop_up_l1)
         BICS    a4,a3,#3        /* set counter to multiple of 4 */
         MOVEQ   a1,#0           /* return false */
-        MOVEQS  pc,lr           /* if zero then we're done */
+        BXEQ    lr           /* if zero then we're done */
         STMFD   sp!,{v1-v6,lr}  /* save work regs */
         MOV     v6,a1           /* move xptr to v6 */
         MOV     a1,#1           /* set result to true */
@@ -952,11 +952,11 @@ LABEL(and_test_loop_up_l2)
         TSTEQ   v4,v1
         TSTEQ   v5,v2
         TSTEQ   lr,ip
-        LDMNEFD sp!,{v1-v6,pc}^
+        LDMNEFD sp!,{v1-v6,pc}
         SUBS    a4,a4,#4            /* decrement counter by 4 */
         BGT     and_test_loop_up_l2 /* if count still positive then loop */
         MOV     a1,#0
-        LDMFD   sp!,{v1-v6,pc}^ /* restore work regs and return */
+        LDMFD   sp!,{v1-v6,pc}  /* restore work regs and return */
 
 /* extern void test_loop_up (uintD* xptr, uintC count);
        entry
@@ -973,21 +973,21 @@ GLABEL(test_loop_up)
         BEQ     test_loop_up_l1 /* yup, so branch */
         LDR     a4,[ip],#4      /* TEST the first 1-3 words */
         TEQ     a4,#0           /* align the total to a multiple of 4 */
-        MOVNES  pc,lr           /* return true if AND_TEST ok */
+        BXNE    lr              /* return true if AND_TEST ok */
         CMP     a3,#2
         BLT     test_loop_up_l1 /* need to branch 'cos PSR set */
         LDRGE   a4,[ip],#4      /* when checking against zero */
         TEQGE   a4,#0
-        MOVNES  pc,lr
+        BXNE    lr
         CMP     a3,#2
         BLE     test_loop_up_l1 /* need to branch 'cos PSR set */
         LDRGT   a4,[ip],#4      /* when checking against zero */
         TEQGT   a4,#0
-        MOVNES  pc,lr
+        BXNE    lr
 LABEL(test_loop_up_l1)
         BICS    a4,a2,#3        /* set counter to multiple of 4 */
         MOVEQ   a1,#0           /* return false */
-        MOVEQS  pc,lr           /* if zero then we're done */
+        BXEQ    lr              /* if zero then we're done */
         STMFD   sp!,{v1,lr}     /* save work regs */
 LABEL(test_loop_up_l2)
         LDMIA   ip!,{a2,a3,v1,lr} /* load 4 words in one go */
@@ -995,11 +995,11 @@ LABEL(test_loop_up_l2)
         TEQEQ   a3,#0
         TEQEQ   v1,#0
         TEQEQ   lr,#0
-        LDMNEFD sp!,{v1,pc}^
+        LDMNEFD sp!,{v1,pc}
         SUBS    a4,a4,#4        /* decrement counter by 4 */
         BGT     test_loop_up_l2 /* if count still positive then loop */
         MOV     a1,#0
-        LDMFD   sp!,{v1,pc}^    /* restore work regs and return */
+        LDMFD   sp!,{v1,pc}     /* restore work regs and return */
 
 /* extern void compare_loop_up (uintD* xptr, uintD* yptr, uintC count);
        entry
@@ -1021,7 +1021,7 @@ GLABEL(compare_loop_up)
         CMP     ip,a4           /* of 4 words */
         MVNLO   a1,#0           /* x < y -> -1 */
         MOVHI   a1,#1           /* x > y -> +1 */
-        MOVNES  pc,lr           /* and return result if not equal */
+        BXNE    lr              /* and return result if not equal */
         ANDS    a4,a3,#3
         CMP     a4,#2
         BLT     compare_loop_up_l1 /* need to branch 'cos PSR used */
@@ -1030,7 +1030,7 @@ GLABEL(compare_loop_up)
         CMP     ip,a4
         MVNLO   a1,#0
         MOVHI   a1,#1
-        MOVNES  pc,lr
+        BXNE    lr
         ANDS    a4,a3,#3
         CMP     a4,#2
         BLE     compare_loop_up_l1 /* need to branch 'cos PSR used */
@@ -1039,11 +1039,11 @@ GLABEL(compare_loop_up)
         CMP     ip,a4
         MVNLO   a1,#0
         MOVHI   a1,#1
-        MOVNES  pc,lr
+        BXNE    lr
 LABEL(compare_loop_up_l1)
         BICS    a4,a3,#3        /* set counter to multiple of 4 */
         MOVEQ   a1,#0           /* xptr[] == yptr[] -> 0 */
-        MOVEQS  pc,lr           /* if zero then we're done */
+        BXEQ    lr              /* if zero then we're done */
         STMFD   sp!,{v1-v6,lr}  /* save work regs */
         MOV     v6,a1           /* move xptr to v6 */
         MOV     a1,#1           /* set result to +1 */
@@ -1055,11 +1055,11 @@ LABEL(compare_loop_up_l2)
         CMPEQ   v5,v2
         CMPEQ   lr,ip
         MVNLO   a1,#0           /* x < y -> -1 (a1 already holds +1) */
-        LDMNEFD sp!,{v1-v6,pc}^
+        LDMNEFD sp!,{v1-v6,pc}
         SUBS    a4,a4,#4           /* decrement counter by 4 */
         BGT     compare_loop_up_l2 /* if count still positive then loop */
         MOV     a1,#0
-        LDMFD   sp!,{v1-v6,pc}^ /* restore work regs and return */
+        LDMFD   sp!,{v1-v6,pc}  /* restore work regs and return */
 
 /* extern uintD addto_loop_down (uintD* sourceptr, uintD* destptr, uintC count);
        entry
@@ -1111,11 +1111,11 @@ LABEL(add_loop_down_l0)          /* at l
         BICS    a4,a4,#3         /* set counter to multiple of 4 */
         BNE     add_loop_down_l3 /* branch if more adds to do */
         ADCEQ   a1,a4,a4         /* set result to Carry (a4 is 0) */
-        LDMEQFD sp!,{v6,pc}^     /* and return */
+        LDMEQFD sp!,{v6,pc}      /* and return */
 LABEL(add_loop_down_l1)
         BICS    a4,a4,#3        /* set counter to multiple of 4 */
         MOVEQ   a1,#0           /* no adds, so C = 0 */
-        MOVEQS  pc,lr           /* if zero then we're done */
+        BXEQ    lr             /* if zero then we're done */
         CMN     a4,#0           /* clear carry bit */
         STMFD   sp!,{v6,lr}
 LABEL(add_loop_down_l3)
@@ -1132,7 +1132,7 @@ LABEL(add_loop_down_l2)
         TEQ     a4,#0           /* are we done ? */
         BNE     add_loop_down_l2 /* if count non-zero then loop */
         ADC     a1,a4,a4         /* set result to Carry (a4 is 0) */
-        LDMFD   sp!,{v1-v6,pc}^  /* restore work regs and return */
+        LDMFD   sp!,{v1-v6,pc}   /* restore work regs and return */
 
 /* extern uintD inc_loop_down (uintD* ptr, uintC count);
        entry
@@ -1150,11 +1150,11 @@ GLABEL(inc_loop_down)
         ADDS    a4,a4,#1        /* align the total to a multiple of 2 */
         STR     a4,[a1]
         MOVNE   a1,#0           /* set result to 0 */
-        MOVNES  pc,lr           /* return 0 if non-zero result */
+        BXNE    lr              /* return 0 if non-zero result */
 LABEL(inc_loop_down_l1)
         BICS    a4,a2,#1        /* set counter to multiple of 2 */
         MOVEQ   a1,#1           /* return 1 */
-        MOVEQS  pc,lr           /* if zero then we're done */
+        BXEQ    lr              /* if zero then we're done */
         MOV     ip,a1           /* move ptr to ip */
         MOV     a1,#0           /* set result to 0 */
         ANDS    a3,a4,#3
@@ -1163,10 +1163,10 @@ LABEL(inc_loop_down_l1)
         ADDS    a3,a3,#1        /* INC the two words */
         ADDEQS  a2,a2,#1        /* stopping when first word non-zero */
         STMDB   ip!,{a2,a3}     /* store 2 results */
-        MOVNES  pc,lr           /* return 0 if any result non-zero */
+        BXNE    lr              /* return 0 if any result non-zero */
         SUBS    a4,a4,#2        /* decrement counter by 2 */
         MOVEQ   a1,#1           /* if finished loop then */
-        MOVEQS  pc,lr           /* return 1 */
+        BXEQ    lr              /* return 1 */
 LABEL(inc_loop_down_l3)         /* now a multiple of 4 words */
         STMFD   sp!,{v1,lr}     /* save work regs */
 LABEL(inc_loop_down_l2)
@@ -1176,11 +1176,11 @@ LABEL(inc_loop_down_l2)
         ADDEQS  a3,a3,#1
         ADDEQS  a2,a2,#1
         STMDB   ip!,{a2,a3,v1,lr} /* store 4 results */
-        LDMNEFD sp!,{v1,pc}^      /* return 0 if any result non-zero */
+        LDMNEFD sp!,{v1,pc}       /* return 0 if any result non-zero */
         SUBS    a4,a4,#4          /* decrement counter by 4 */
         BGT     inc_loop_down_l2 /* if count still positive then loop */
         MOV     a1,#1
-        LDMFD   sp!,{v1,pc}^    /* restore work regs and return 1 */
+        LDMFD   sp!,{v1,pc}     /* restore work regs and return 1 */
 
 /* extern uintD sub_loop_down (uintD* sourceptr1, uintD* sourceptr2, uintD* destptr, uintC count);
        entry
@@ -1206,7 +1206,7 @@ GLABEL(sub_loop_down)
 LABEL(sub_loop_down_l4)     /* drop through for better instr. timings */
         BICS    a4,a4,#3    /* set counter to multiple of 4 */
         SBCEQ   a1,a4,a4    /* set result to Carry (a4 is 0) */
-        LDMEQFD sp!,{v6,pc}^     /* and return */
+        LDMEQFD sp!,{v6,pc}      /* and return */
         STMFD   sp!,{v1-v5}      /* save work regs */
         B       sub_loop_down_l2 /* branch if more subtracts to do */
 LABEL(sub_loop_down_l0)
@@ -1224,7 +1224,7 @@ LABEL(sub_loop_down_l0)
 LABEL(sub_loop_down_l1)
         BICS    a4,a4,#3        /* set counter to multiple of 4 */
         MOVEQ   a1,#0           /* no subtracts, so C = 0 */
-        MOVEQS  pc,lr           /* if zero then we're done */
+        BXEQ    lr              /* if zero then we're done */
         CMP     a4,#0           /* set carry bit, since a4 > 0 */
         STMFD   sp!,{v1-v6,lr}  /* save work regs */
 LABEL(sub_loop_down_l2)
@@ -1239,7 +1239,7 @@ LABEL(sub_loop_down_l2)
         TEQ     a4,#0           /* are we done ? */
         BNE     sub_loop_down_l2 /* if count non-zero then loop */
         SBC     a1,a4,a4         /* set result to Carry (a4 is 0) */
-        LDMFD   sp!,{v1-v6,pc}^  /* restore work regs and return */
+        LDMFD   sp!,{v1-v6,pc}   /* restore work regs and return */
 
 /* extern uintD subx_loop_down (uintD* sourceptr1, uintD* sourceptr2, uintD* destptr, uintC count, uintD carry);
        entry
@@ -1269,7 +1269,7 @@ LABEL(subx_loop_down_lsub)
 LABEL(subx_loop_down_l4)    /* drop through for better instr. timings */
         BICS    a4,a4,#3    /* set counter to multiple of 4 */
         SBCEQ   a1,a4,a4    /* set result to Carry (a4 is 0) */
-        LDMEQFD sp!,{v6,pc}^      /* and return */
+        LDMEQFD sp!,{v6,pc}       /* and return */
         STMFD   sp!,{v1-v5}       /* save work regs */
         B       subx_loop_down_l2 /* branch if more subtracts to do */
 LABEL(subx_loop_down_l0)
@@ -1287,7 +1287,7 @@ LABEL(subx_loop_down_l0)
 LABEL(subx_loop_down_l1)
         BICS    a4,a4,#3        /* set counter to multiple of 4 */
         SBCEQ   a1,a4,a4        /* set result to Carry (a4 is 0) */
-        MOVEQS  pc,lr           /* if zero then we're done */
+        BXEQ    lr              /* if zero then we're done */
         STMFD   sp!,{v1-v6,lr}  /* save work regs */
 LABEL(subx_loop_down_l2)
         LDMDB   a2!,{v1,v2,v3,ip} /* load 4 words in one go */
@@ -1301,7 +1301,7 @@ LABEL(subx_loop_down_l2)
         TEQ     a4,#0           /* are we done ? */
         BNE     subx_loop_down_l2 /* if count non-zero then loop */
         SBC     a1,a4,a4          /* set result to Carry (a4 is 0) */
-        LDMFD   sp!,{v1-v6,pc}^   /* restore work regs and return */
+        LDMFD   sp!,{v1-v6,pc}    /* restore work regs and return */
 
 /* extern uintD subfrom_loop_down (uintD* sourceptr, uintD* destptr, uintC count);
        entry
@@ -1326,7 +1326,7 @@ GLABEL(subfrom_loop_down)
 LABEL(subfrom_loop_down_l4) /* drop through for better instr. timings */
         BICS    a4,a3,#3    /* set counter to multiple of 4 */
         SBCEQ   a1,a4,a4    /* set result to Carry (a4 is 0) */
-        LDMEQFD sp!,{pc}^   /* and return */
+        LDMEQFD sp!,{pc}    /* and return */
         STMFD   sp!,{v1-v5} /* save work regs */
         B       subfrom_loop_down_l2 /* branch if more subtracts to do */
 LABEL(subfrom_loop_down_l0)
@@ -1344,7 +1344,7 @@ LABEL(subfrom_loop_down_l0)
 LABEL(subfrom_loop_down_l1)
         BICS    a4,a3,#3        /* set counter to multiple of 4 */
         MOVEQ   a1,#0           /* no subtracts, so C = 0 */
-        MOVEQS  pc,lr           /* if zero then we're done */
+        BXEQ    lr              /* if zero then we're done */
         CMP     a4,#0           /* set carry bit, since a4 > 0 */
         STMFD   sp!,{v1-v5,lr}  /* save work regs */
 LABEL(subfrom_loop_down_l2)
@@ -1359,7 +1359,7 @@ LABEL(subfrom_loop_down_l2)
         TEQ     a4,#0           /* are we done ? */
         BNE     subfrom_loop_down_l2 /* if count non-zero then loop */
         SBC     a1,a4,a4             /* set result to Carry (a4 is 0) */
-        LDMFD   sp!,{v1-v5,pc}^      /* restore work regs and return */
+        LDMFD   sp!,{v1-v5,pc}       /* restore work regs and return */
 
 /* extern uintD dec_loop_down (uintD* ptr, uintC count);
        entry
@@ -1377,11 +1377,11 @@ GLABEL(dec_loop_down)
         SUBS    a4,a4,#1        /* align the total to a multiple of 2 */
         STR     a4,[a1]
         MOVCS   a1,#0           /* set result to 0 */
-        MOVCSS  pc,lr           /* return 0 if non-zero result */
+        BXCS    lr              /* return 0 if non-zero result */
 LABEL(dec_loop_down_l1)
         BICS    a4,a2,#1        /* set counter to multiple of 2 */
         MVNEQ   a1,#0           /* return -1 */
-        MOVEQS  pc,lr           /* if zero then we're done */
+        BXEQ    lr              /* if zero then we're done */
         MOV     ip,a1           /* move ptr to ip */
         MOV     a1,#0           /* set result to 0 */
         ANDS    a3,a4,#3
@@ -1390,10 +1390,10 @@ LABEL(dec_loop_down_l1)
         SUBS    a3,a3,#1        /* DEC the two words */
         SUBCCS  a2,a2,#1        /* stopping when first word non-zero */
         STMDB   ip!,{a2,a3}     /* store 2 results */
-        MOVCSS  pc,lr           /* return 0 if any result non-zero */
+        BXCS    lr              /* return 0 if any result non-zero */
         SUBS    a4,a4,#2        /* decrement counter by 2 */
         MVNEQ   a1,#0           /* if finished loop then */
-        MOVEQS  pc,lr           /* return -1 */
+        BXEQ    lr              /* return -1 */
 LABEL(dec_loop_down_l3)         /* now a multiple of 4 words */
         STMFD   sp!,{v1,lr}     /* save work regs */
 LABEL(dec_loop_down_l2)
@@ -1403,11 +1403,11 @@ LABEL(dec_loop_down_l2)
         SUBCCS  a3,a3,#1
         SUBCCS  a2,a2,#1
         STMDB   ip!,{a2,a3,v1,lr} /* store 4 results */
-        LDMCSFD sp!,{v1,pc}^      /* return 0 if any carry */
+        LDMCSFD sp!,{v1,pc}       /* return 0 if any carry */
         SUBS    a4,a4,#4          /* decrement counter by 4 */
         BGT     dec_loop_down_l2 /* if count still positive then loop */
         MVN     a1,#0
-        LDMFD   sp!,{v1,pc}^    /* restore work regs and return -1 */
+        LDMFD   sp!,{v1,pc}     /* restore work regs and return -1 */
 
 /* extern void neg_loop_down (uintD* ptr, uintC count);
        entry
@@ -1421,7 +1421,7 @@ LABEL(dec_loop_down_l2)
 GLABEL(neg_loop_down)
         CMPS    a2,#0           /* count = 0 ? */
         MOVEQ   a1,#0           /* yup, so return 0 */
-        MOVEQS  pc,lr
+        BXEQ    lr
 LABEL(neg_loop_down_l1)          /* skip all the zero words first */
         LDR     a3,[a1,#-4]!     /* compare words against zero */
         CMPS    a3,#0            /* downwards in memory */
@@ -1429,13 +1429,13 @@ LABEL(neg_loop_down_l1)          /* skip
         SUBS    a2,a2,#1         /* reduce count of words */
         BNE     neg_loop_down_l1 /* more ?, so loop */
         MOV     a1,#0            /* return 0 */
-        MOVS    pc,lr
+        BX      lr
 LABEL(neg_loop_down_l2)
         RSB     a3,a3,#0        /* first non-zero word = -word */
         STR     a3,[a1]
         SUBS    a2,a2,#1
         MVNEQ   a1,#0           /* done ? -> return -1 */
-        MOVEQS  pc,lr
+        BXEQ    lr
                                         /* now NOT rest of the words */
         ANDS    a3,a2,#3                /* multiple of 4 words ? */
         BEQ     neg_loop_down_l3        /* yup, so branch */
@@ -1453,7 +1453,7 @@ LABEL(neg_loop_down_l2)
 LABEL(neg_loop_down_l3)
         BICS    a4,a2,#3        /* set counter to multiple of 4 */
         MVNEQ   a1,#0           /* set result to -1 */
-        MOVEQS  pc,lr           /* if zero then we're done */
+        BXEQ    lr              /* if zero then we're done */
         STMFD   sp!,{lr}        /* save work regs */
 LABEL(neg_loop_down_l4)
         LDMDB   a1,{a2,a3,ip,lr} /* load 4 words in one go,NO writeback */
@@ -1465,7 +1465,7 @@ LABEL(neg_loop_down_l4)
         SUBS    a4,a4,#4          /* decrement counter by 4 */
         BGT     neg_loop_down_l4 /* if count still positive then loop */
         MVN     a1,#0            /* set result to -1 */
-        LDMFD   sp!,{pc}^        /* restore work regs and return -1 */
+        LDMFD   sp!,{pc}         /* restore work regs and return -1 */
 
 /* extern uintD shift1left_loop_down (uintD* ptr, uintC count);
        entry
@@ -1485,7 +1485,7 @@ GLABEL(shift1left_loop_down)
 LABEL(shift1left_loop_down_l1)
         BICS    a4,a2,#1        /* set counter to multiple of 2 */
         ADCEQ   a1,a4,a4        /* if zero set result to C (a4 is 0) */
-        MOVEQS  pc,lr           /* and return */
+        BXEQ    lr              /* and return */
         ANDS    a3,a4,#3        /* multiple of 4 words ? */
         BEQ     shift1left_loop_down_l3 /* yup, so branch */
         LDMDB   a1,{a2,a3}              /* load 2 words in one go */
@@ -1494,7 +1494,7 @@ LABEL(shift1left_loop_down_l1)
         STMDB   a1!,{a2,a3}     /* store 2 results */
         BICS    a4,a4,#2        /* decrement counter by 2 */
         ADCEQ   a1,a4,a4        /* set result to Carry (a4 is 0) */
-        MOVEQS  pc,lr           /* and return */
+        BXEQ    lr              /* and return */
 LABEL(shift1left_loop_down_l3)  /* now a multiple of 4 words */
         STMFD   sp!,{lr}        /* save work regs */
 LABEL(shift1left_loop_down_l2)
@@ -1508,7 +1508,7 @@ LABEL(shift1left_loop_down_l2)
         TEQ     a4,#0                   /* are we done ? */
         BNE     shift1left_loop_down_l2 /* if count non-zero then loop */
         ADC     a1,a4,a4        /* set result to Carry (a4 is 0) */
-        LDMFD   sp!,{pc}^       /* restore work regs and return 1 */
+        LDMFD   sp!,{pc}        /* restore work regs and return 1 */
 
 /* extern uintD shiftleft_loop_down (uintD* ptr, uintC count, uintC i, uintD carry);
        entry
@@ -1542,7 +1542,7 @@ GLABEL(shiftleft_loop_down)
 LABEL(shiftleft_loop_down_l1)
         BICS    ip,a2,#3        /* set counter to multiple of 4 */
         MOVEQ   a1,a4           /* if zero then we're done */
-        LDMEQFD sp!,{v6,pc}^    /* so return last shift out */
+        LDMEQFD sp!,{v6,pc}     /* so return last shift out */
         STMFD   sp!,{v1-v3}     /* save work regs */
 LABEL(shiftleft_loop_down_l2)
         LDMDB   a1,{a2,v1,v2,v3} /* load 4 words in one go */
@@ -1558,7 +1558,7 @@ LABEL(shiftleft_loop_down_l2)
         SUBS    ip,ip,#4               /* decrement counter by 4 */
         BGT     shiftleft_loop_down_l2 /* if count still positive then loop */
         MOV     a1,a4                  /* result = last shift out */
-        LDMFD   sp!,{v1-v3,v6,pc}^ /* restore work regs and return */
+        LDMFD   sp!,{v1-v3,v6,pc}  /* restore work regs and return */
 
 /* extern uintD shiftleftcopy_loop_down (uintD* sourceptr, uintD* destptr, uintC count, uintC i);
        entry
@@ -1593,7 +1593,7 @@ GLABEL(shiftleftcopy_loop_down)
 LABEL(shiftleftcopy_loop_down_l1)
         BICS    ip,a3,#3        /* set counter to multiple of 4 */
         MOVEQ   a1,v5           /* if zero then we're done */
-        LDMEQFD sp!,{v5,v6,pc}^ /* so return last shift out */
+        LDMEQFD sp!,{v5,v6,pc}  /* so return last shift out */
         STMFD   sp!,{v1-v3}     /* save work regs */
 LABEL(shiftleftcopy_loop_down_l2)
         LDMDB   a1!,{a3,v1,v2,v3} /* load 4 words in one go */
@@ -1609,7 +1609,7 @@ LABEL(shiftleftcopy_loop_down_l2)
         SUBS    ip,ip,#4                   /* decrement counter by 4 */
         BGT     shiftleftcopy_loop_down_l2 /* if count still positive then loop */
         MOV     a1,v5                      /* result = last shift out */
-        LDMFD   sp!,{v1-v3,v5,v6,pc}^ /* restore work regs and return */
+        LDMFD   sp!,{v1-v3,v5,v6,pc}  /* restore work regs and return */
 
 /* extern uintD shift1right_loop_up (uintD* ptr, uintC count, uintD carry);
        entry
@@ -1630,7 +1630,7 @@ GLABEL(shift1right_loop_up)
 LABEL(shift1right_loop_up_l1)
         BICS    a4,a2,#1        /* set counter to multiple of 2 */
         MOVEQ   a1,a4,RRX       /* if zero set result to C (a4 is 0) */
-        MOVEQS  pc,lr           /* and return */
+        BXEQ    lr              /* and return */
         ANDS    a3,a4,#3        /* multiple of 4 words ? */
         BEQ     shift1right_loop_up_l3 /* yup, so branch */
         LDMIA   a1,{a2,a3}             /* load 2 words in one go */
@@ -1639,7 +1639,7 @@ LABEL(shift1right_loop_up_l1)
         STMIA   a1!,{a2,a3}     /* store 2 results */
         BICS    a4,a4,#2        /* decrement counter by 2 */
         ADCEQ   a1,a4,a4        /* set result to Carry (a4 is 0) */
-        MOVEQS  pc,lr           /* and return */
+        BXEQ    lr              /* and return */
 LABEL(shift1right_loop_up_l3)   /* now a multiple of 4 words */
         STMFD   sp!,{lr}        /* save work regs */
 LABEL(shift1right_loop_up_l2)
@@ -1653,7 +1653,7 @@ LABEL(shift1right_loop_up_l2)
         TEQ     a4,#0                  /* are we done ? */
         BNE     shift1right_loop_up_l2 /* if count non-zero then loop */
         MOV     a1,a4,RRX       /* set result to Carry (a4 is 0) */
-        LDMFD   sp!,{pc}^       /* restore work regs and return 1 */
+        LDMFD   sp!,{pc}        /* restore work regs and return 1 */
 
 /* extern uintD shiftright_loop_up (uintD* ptr, uintC count, uintC i);
        entry
@@ -1688,7 +1688,7 @@ LABEL(shiftright_loop_up_l0)
 LABEL(shiftright_loop_up_l1)
         BICS    ip,a2,#3        /* set counter to multiple of 4 */
         MOVEQ   a1,a4           /* if zero then we're done */
-        LDMEQFD sp!,{v6,pc}^    /* so return last shift out */
+        LDMEQFD sp!,{v6,pc}     /* so return last shift out */
         STMFD   sp!,{v1-v3}     /* save work regs */
 LABEL(shiftright_loop_up_l2)
         LDMIA   a1,{v1,v2,v3,lr} /* load 4 words in one go */
@@ -1704,7 +1704,7 @@ LABEL(shiftright_loop_up_l2)
         SUBS    ip,ip,#4              /* decrement counter by 4 */
         BGT     shiftright_loop_up_l2 /* if count still positive then loop */
         MOV     a1,a4                 /* result = last shift out */
-        LDMFD   sp!,{v1-v3,v6,pc}^    /* restore work regs and return */
+        LDMFD   sp!,{v1-v3,v6,pc}     /* restore work regs and return */
 
 /* extern uintD shiftrightsigned_loop_up (uintD* ptr, uintC count, uintC i);
        entry
@@ -1759,7 +1759,7 @@ LABEL(shiftrightcopy_loop_up_l0)
 LABEL(shiftrightcopy_loop_up_l1)
         BICS    ip,a3,#3        /* set counter to multiple of 4 */
         MOVEQ   a1,v5           /* if zero then we're done */
-        LDMEQFD sp!,{v5,v6,pc}^ /* so return last shift out */
+        LDMEQFD sp!,{v5,v6,pc}  /* so return last shift out */
         STMFD   sp!,{v1-v3}     /* save work regs */
 LABEL(shiftrightcopy_loop_up_l2)
         LDMIA   a1!,{v1,v2,v3,lr} /* load 4 words in one go */
@@ -1775,7 +1775,7 @@ LABEL(shiftrightcopy_loop_up_l2)
         SUBS    ip,ip,#4                  /* decrement counter by 4 */
         BGT     shiftrightcopy_loop_up_l2 /* if count still positive then loop */
         MOV     a1,v5                     /* result = last shift out */
-        LDMFD   sp!,{v1-v3,v5,v6,pc}^ /* restore work regs and return */
+        LDMFD   sp!,{v1-v3,v5,v6,pc}  /* restore work regs and return */
 
 #ifndef HAVE_umull
 /* mulu32_64_vregs
@@ -1800,7 +1800,7 @@ LABEL(mulu32_64_vregs)
         ADDCS   v2,v2,#0x10000   /* carry from above add */
         ADDS    v1,v4,ip,LSL #16 /* x is now bottom 32 bits of result */
         ADC     ip,v2,ip,LSR #16 /* hi is top 32 bits */
-        MOVS    pc,lr
+        BX      lr
 #endif  /* HAVE_umull */
 
 /* extern uintD mulusmall_loop_down (uintD digit, uintD* ptr, uintC len, uintD newdigit);
@@ -1816,7 +1816,7 @@ LABEL(mulu32_64_vregs)
 GLABEL(mulusmall_loop_down)
         CMP     a3,#0
         MOVEQ   a1,a4
-        MOVEQS  pc,lr
+        BXEQ    lr
 #ifdef HAVE_umull
         STMFD   sp!,{v1,lr}
 LABEL(mulusmall_loop_down_l1)
@@ -1828,7 +1828,7 @@ LABEL(mulusmall_loop_down_l1)
         SUBS    a3,a3,#1       /* len-- */
         BNE     mulusmall_loop_down_l1 /* until len==0 */
         MOV     a1,a4                  /* return carry */
-        LDMFD   sp!,{v1,pc}^
+        LDMFD   sp!,{v1,pc}
 #else
         STMFD   sp!,{v1-v2,lr}
 LABEL(mulusmall_loop_down_l1)
@@ -1850,7 +1850,7 @@ LABEL(mulusmall_loop_down_l1)
         SUBS    a3,a3,#1       /* len-- */
         BNE     mulusmall_loop_down_l1 /* until len==0 */
         MOV     a1,a4                  /* return carry */
-        LDMFD   sp!,{v1-v2,pc}^
+        LDMFD   sp!,{v1-v2,pc}
 #endif
 
 /* extern void mulu_loop_down (uintD digit, uintD* sourceptr, uintD* destptr, uintC len);
@@ -1875,7 +1875,7 @@ LABEL(mulu_loop_down_l1)
         SUBS    a4,a4,#1       /* len-- */
         BNE     mulu_loop_down_l1 /* until len==0 */
         STR     v5,[a3,#-4]!      /* *--destptr = carry */
-        LDMFD   sp!,{v1,v5,pc}^
+        LDMFD   sp!,{v1,v5,pc}
 #else
         STMFD   sp!,{v1-v5,lr}
         MOV     v5,#0
@@ -1888,7 +1888,7 @@ LABEL(mulu_loop_down_l1)
         SUBS    a4,a4,#1       /* len-- */
         BNE     mulu_loop_down_l1 /* until len==0 */
         STR     v5,[a3,#-4]!      /* *--destptr = carry */
-        LDMFD   sp!,{v1-v5,pc}^
+        LDMFD   sp!,{v1-v5,pc}
 #endif
 
 /* extern void muluadd_loop_down (uintD digit, uintD* sourceptr, uintD* destptr, uintC len);
@@ -1916,7 +1916,7 @@ LABEL(muluadd_loop_down_l1)
         SUBS    a4,a4,#1       /* len-- */
         BNE     muluadd_loop_down_l1 /* until len==0 */
         MOV     a1,v5                /* return carry */
-        LDMFD   sp!,{v1,v5,pc}^
+        LDMFD   sp!,{v1,v5,pc}
 #else
         STMFD   sp!,{v1-v5,lr}
         MOV     v5,#0
@@ -1932,7 +1932,7 @@ LABEL(muluadd_loop_down_l1)
         SUBS    a4,a4,#1       /* len-- */
         BNE     muluadd_loop_down_l1 /* until len==0 */
         MOV     a1,v5                /* return carry */
-        LDMFD   sp!,{v1-v5,pc}^
+        LDMFD   sp!,{v1-v5,pc}
 #endif
 
 /* extern void mulusub_loop_down (uintD digit, uintD* sourceptr, uintD* destptr, uintC len);
@@ -1960,7 +1960,7 @@ LABEL(mulusub_loop_down_l1)
         SUBS    a4,a4,#1       /* len-- */
         BNE     mulusub_loop_down_l1 /* until len==0 */
         MOV     a1,v5                /* return carry */
-        LDMFD   sp!,{v1,v5,pc}^
+        LDMFD   sp!,{v1,v5,pc}
 #else
         STMFD   sp!,{v1-v5,lr}
         MOV     v5,#0
@@ -1976,7 +1976,7 @@ LABEL(mulusub_loop_down_l1)
         SUBS    a4,a4,#1       /* len-- */
         BNE     mulusub_loop_down_l1 /* until len==0 */
         MOV     a1,v5                /* return carry */
-        LDMFD   sp!,{v1-v5,pc}^
+        LDMFD   sp!,{v1-v5,pc}
 #endif
 
         END