diff -Nru clisp-2.49/debian/changelog clisp-2.49/debian/changelog
--- clisp-2.49/debian/changelog	2012-02-17 17:06:28.000000000 +0000
+++ clisp-2.49/debian/changelog	2013-05-07 21:39:32.000000000 +0100
@@ -1,3 +1,16 @@
+clisp (1:2.49-8.2) unstable; urgency=low
+
+  * Non-maintainer upload.
+  * Add armhf to architecture lists
+  * Build with -marm on armhf  due to thumb incompatible code (specifically 
+    code that does not like odd function pointers)
+  * apply patch from sourceforce to fix illegal instruction error on newer
+    arm hardware caused by arm assembler (thanks to jerry james and tomfor)
+    (closes: 684631)
+  * Fix build errors with eglibc 2.17 (closes: 701379)
+
+ -- Peter Michael Green <plugwash@debian.org>  Tue, 07 May 2013 20:39:13 +0000
+
 clisp (1:2.49-8.1) unstable; urgency=low
 
   * Non-maintainer upload.
diff -Nru clisp-2.49/debian/control clisp-2.49/debian/control
--- clisp-2.49/debian/control	2012-02-17 17:06:28.000000000 +0000
+++ clisp-2.49/debian/control	2013-05-05 03:03:07.000000000 +0100
@@ -3,7 +3,7 @@
 Priority: optional
 Maintainer: Debian Common Lisp Team <pkg-common-lisp-devel@lists.alioth.debian.org>
 Uploaders: Peter Van Eynde <pvaneynd@debian.org>, Christoph Egger <christoph@debian.org>
-Build-Depends: debhelper (>> 7), gettext, bison, libncurses5-dev, groff, libx11-dev, libxext-dev, libxpm-dev, libsigsegv-dev (>= 2.8), libreadline-gplv2-dev, dh-lisp (>= 0.7.1), libdb-dev, libffcall1-dev , libgdbm-dev , libpq-dev [ !armel !hppa !ia64 !m68k !s390 !mipsel !powerpc], libpcre3-dev, libdbus-1-dev [ !armel !hppa !ia64 !m68k !s390 !mipsel !powerpc], zlib1g-dev [ !armel !hppa !ia64 !m68k !s390 !mipsel !powerpc]
+Build-Depends: debhelper (>> 7), gettext, bison, libncurses5-dev, groff, libx11-dev, libxext-dev, libxpm-dev, libsigsegv-dev (>= 2.8), libreadline-gplv2-dev, dh-lisp (>= 0.7.1), libdb-dev, libffcall1-dev , libgdbm-dev , libpq-dev [ !armel !armhf !hppa !ia64 !m68k !s390 !mipsel !powerpc], libpcre3-dev, libdbus-1-dev [ !armel !armhf !hppa !ia64 !m68k !s390 !mipsel !powerpc], zlib1g-dev [ !armel !armhf !hppa !ia64 !m68k !s390 !mipsel !powerpc]
 Build-Conflicts: libsigsegv-dev (<= 2.8), libreadline6-dev
 Standards-Version: 3.9.1.0
 Homepage: http://www.clisp.org/
@@ -11,7 +11,7 @@
 Vcs-Browser: http://git.debian.org/?p=pkg-common-lisp/clisp.git;a=summary
 
 Package: clisp
-Architecture: alpha amd64 armel hppa i386 ia64 mips mipsel powerpc kfreebsd-i386 kfreebsd-amd64 m68k hurd-i386 s390 sparc
+Architecture: alpha amd64 armel armhf hppa i386 ia64 mips mipsel powerpc kfreebsd-i386 kfreebsd-amd64 m68k hurd-i386 s390 sparc
 Pre-Depends: ${xlibs:PreDepends}
 Conflicts: clisp-dev (<< 1:2.49-2)
 Depends: ${shlibs:Depends}, ${misc:Depends}
@@ -40,7 +40,7 @@
  GNU CLISP runs Maxima, ACL2 and many other Common Lisp packages.
 
 Package: clisp-dev
-Architecture: alpha amd64 armel hppa i386 ia64 mips mipsel powerpc kfreebsd-i386 kfreebsd-amd64 m68k hurd-i386 s390 sparc
+Architecture: alpha amd64 armel armhf hppa i386 ia64 mips mipsel powerpc kfreebsd-i386 kfreebsd-amd64 m68k hurd-i386 s390 sparc
 Depends: clisp, ${misc:Depends}
 Description: GNU CLISP, a Common Lisp implementation (development files)
  This is the link kit of clisp, it can be used to add external modules (written
@@ -78,14 +78,14 @@
 
 
 Package: clisp-module-berkeley-db
-Architecture: alpha amd64 armel hppa i386 ia64 mips mipsel powerpc kfreebsd-i386 kfreebsd-amd64 m68k hurd-i386 s390
+Architecture: alpha amd64 armel armhf hppa i386 ia64 mips mipsel powerpc kfreebsd-i386 kfreebsd-amd64 m68k hurd-i386 s390
 Depends: ${shlibs:Depends}, clisp, ${misc:Depends}
 Description: clisp module that adds an interface to Berkeley DB
  This adds a module to clisp that implements an interface to the 
  Berkeley DB.
 
 Package: clisp-module-pcre
-Architecture: alpha amd64 armel hppa i386 ia64 mips mipsel powerpc kfreebsd-i386 kfreebsd-amd64 m68k hurd-i386 s390
+Architecture: alpha amd64 armel armhf hppa i386 ia64 mips mipsel powerpc kfreebsd-i386 kfreebsd-amd64 m68k hurd-i386 s390
 Depends: ${shlibs:Depends}, clisp, ${misc:Depends}
 Description: clisp module that adds libpcre support
  This adds a module to clisp that implements an interface to the 
@@ -106,14 +106,14 @@
  PostgreSQL DB using the C bindings.
 
 Package: clisp-module-clx	      
-Architecture: alpha amd64 armel hppa i386 ia64 mips mipsel powerpc kfreebsd-i386 kfreebsd-amd64 m68k hurd-i386 s390
+Architecture: alpha amd64 armel armhf hppa i386 ia64 mips mipsel powerpc kfreebsd-i386 kfreebsd-amd64 m68k hurd-i386 s390
 Depends: ${shlibs:Depends}, clisp, ${misc:Depends}
 Description: clisp module that adds X11 bindings
  This adds a module to clisp that implements an interface to the 
  X11 called CLX.
 
 Package: clisp-module-rawsock
-Architecture: alpha amd64 armel hppa i386 ia64 mips mipsel powerpc kfreebsd-i386 kfreebsd-amd64 m68k hurd-i386 s390
+Architecture: alpha amd64 armel armhf hppa i386 ia64 mips mipsel powerpc kfreebsd-i386 kfreebsd-amd64 m68k hurd-i386 s390
 Depends: ${shlibs:Depends}, clisp, ${misc:Depends}
 Description: clisp module that adds a low level socket interface
  This adds a module to clisp that implements an interface to the 
@@ -134,7 +134,7 @@
  called shell globbing.
 
 Package: clisp-module-gdbm	      
-Architecture: alpha amd64 armel hppa i386 ia64 mips mipsel powerpc kfreebsd-i386 kfreebsd-amd64 m68k hurd-i386 s390
+Architecture: alpha amd64 armel armhf hppa i386 ia64 mips mipsel powerpc kfreebsd-i386 kfreebsd-amd64 m68k hurd-i386 s390
 Depends: ${shlibs:Depends}, clisp, ${misc:Depends}
 Description: clisp module that adds an interface to GNU DBM
  This adds a module to clisp that implements an interface to
diff -Nru clisp-2.49/debian/patches/arm-sf.patch clisp-2.49/debian/patches/arm-sf.patch
--- clisp-2.49/debian/patches/arm-sf.patch	1970-01-01 01:00:00.000000000 +0100
+++ clisp-2.49/debian/patches/arm-sf.patch	2013-05-05 02:56:31.000000000 +0100
@@ -0,0 +1,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
diff -Nru clisp-2.49/debian/patches/eglibc-2.17.patch clisp-2.49/debian/patches/eglibc-2.17.patch
--- clisp-2.49/debian/patches/eglibc-2.17.patch	1970-01-01 01:00:00.000000000 +0100
+++ clisp-2.49/debian/patches/eglibc-2.17.patch	2013-05-07 21:39:04.000000000 +0100
@@ -0,0 +1,39 @@
+Description: Fix build with eglibc 2.17
+ With eglibc2.17 the build failed with a couple of errors
+ .
+ The first error was
+ #error "Never use <bits/ipctypes.h> directly; include <sys/ipc.h> instead."
+ So after working out where linux.c was generated from I made the change
+ suggested in the error message.
+ .
+ The second error was
+ linux.c:613:47: error: '__swblk_t' undeclared (first use in this function)
+ After some googling I found the advice at
+ http://sourceforge.net/mailarchive/message.php?msg_id=30446182 and removed
+ which suggested removing it was the only sane option. Looking at the fact
+ that glibc defined it differently on different platforms i'm inclined to agree
+ and have removed it.
+Author: Peter Michael Green <plugwash@debian.org>
+Bug-Debian: http://bugs.debian.org/701379
+
+Index: clisp-2.49/modules/bindings/glibc/linux.lisp
+===================================================================
+--- clisp-2.49.orig/modules/bindings/glibc/linux.lisp	2013-05-07 20:36:12.000000000 +0000
++++ clisp-2.49/modules/bindings/glibc/linux.lisp	2013-05-07 20:39:01.000000000 +0000
+@@ -67,7 +67,6 @@
+ (def-c-type __daddr_t)          ; int
+ (def-c-type __caddr_t)          ; c-pointer
+ (def-c-type __time_t)           ; long
+-(def-c-type __swblk_t)          ; long
+ 
+ (def-c-type __fd_mask ulong)
+ (eval-when (load compile eval)
+@@ -86,7 +85,7 @@
+ 
+ (def-c-type __key_t)            ; int
+ 
+-(c-lines "#include <bits/ipctypes.h>~%")
++(c-lines "#include <sys/ipc.h>~%")
+ (def-c-type __ipc_pid_t)        ; ushort
+ 
+ ; --------------------------- <sys/types.h> -----------------------------------
diff -Nru clisp-2.49/debian/patches/series clisp-2.49/debian/patches/series
--- clisp-2.49/debian/patches/series	2012-02-17 17:06:28.000000000 +0000
+++ clisp-2.49/debian/patches/series	2013-05-07 20:59:35.000000000 +0100
@@ -4,3 +4,5 @@
 s390x-workaround.patch
 kfreebsd-amd64.diff
 bdb-5.1.patch
+arm-sf.patch
+eglibc-2.17.patch
diff -Nru clisp-2.49/debian/rules clisp-2.49/debian/rules
--- clisp-2.49/debian/rules	2011-04-08 22:37:36.000000000 +0100
+++ clisp-2.49/debian/rules	2013-05-05 09:20:05.000000000 +0100
@@ -25,7 +25,11 @@
 	 CFLAGS:=-mcpu=v9 -fno-gcse -DSAFETY=3 -D SAFETY=3 -D NO_MULTIMAP_SHM -D NO_MULTIMAP_FILE -D NO_SINGLEMAP -D NO_TRIVIALMAP ${CFLAGS}
 endif
 
-ifneq (,$(filter armel hppa ia64 m68k s390 mipsel powerpc,$(DEB_BUILD_ARCH)))
+ifneq (,$(filter armhf ,$(DEB_BUILD_ARCH)))
+	 CFLAGS:=-marm ${CFLAGS}
+endif
+
+ifneq (,$(filter armel armhf hppa ia64 m68k s390 mipsel powerpc,$(DEB_BUILD_ARCH)))
         # Disable FFI
         FFI:=--without-dynamic-ffi
         MODULES:=--with-module=gdbm --with-module=berkeley-db --with-module=pcre --with-module=rawsock --with-module=clx/new-clx
