diff --git a/VersionASM b/VersionASM
index f7aa9a63a22971a9a0c35ba2a6098268fd3a8f1f..15a1708ae6eebe0fcdf8f77ae6fb04bde04747e3 100644
--- a/VersionASM
+++ b/VersionASM
@@ -11,13 +11,13 @@
                         GBLS    Module_HelpVersion
                         GBLS    Module_ComponentName
                         GBLS    Module_ComponentPath
-Module_MajorVersion     SETS    "5.88"
-Module_Version          SETA    588
+Module_MajorVersion     SETS    "5.89"
+Module_Version          SETA    589
 Module_MinorVersion     SETS    ""
-Module_Date             SETS    "29 Feb 2016"
-Module_ApplicationDate  SETS    "29-Feb-16"
+Module_Date             SETS    "08 May 2016"
+Module_ApplicationDate  SETS    "08-May-16"
 Module_ComponentName    SETS    "RISC_OSLib"
 Module_ComponentPath    SETS    "castle/RiscOS/Sources/Lib/RISC_OSLib"
-Module_FullVersion      SETS    "5.88"
-Module_HelpVersion      SETS    "5.88 (29 Feb 2016)"
+Module_FullVersion      SETS    "5.89"
+Module_HelpVersion      SETS    "5.89 (08 May 2016)"
                         END
diff --git a/VersionNum b/VersionNum
index db8a580f21aa46f92a2a0e80b21a8e0a95c232b4..50d1e112347f42a0557062c065644391378ba7a2 100644
--- a/VersionNum
+++ b/VersionNum
@@ -1,23 +1,23 @@
-/* (5.88)
+/* (5.89)
  *
  * This file is automatically maintained by srccommit, do not edit manually.
  * Last processed by srccommit version: 1.1.
  *
  */
-#define Module_MajorVersion_CMHG        5.88
+#define Module_MajorVersion_CMHG        5.89
 #define Module_MinorVersion_CMHG        
-#define Module_Date_CMHG                29 Feb 2016
+#define Module_Date_CMHG                08 May 2016
 
-#define Module_MajorVersion             "5.88"
-#define Module_Version                  588
+#define Module_MajorVersion             "5.89"
+#define Module_Version                  589
 #define Module_MinorVersion             ""
-#define Module_Date                     "29 Feb 2016"
+#define Module_Date                     "08 May 2016"
 
-#define Module_ApplicationDate          "29-Feb-16"
+#define Module_ApplicationDate          "08-May-16"
 
 #define Module_ComponentName            "RISC_OSLib"
 #define Module_ComponentPath            "castle/RiscOS/Sources/Lib/RISC_OSLib"
 
-#define Module_FullVersion              "5.88"
-#define Module_HelpVersion              "5.88 (29 Feb 2016)"
-#define Module_LibraryVersionInfo       "5:88"
+#define Module_FullVersion              "5.89"
+#define Module_HelpVersion              "5.89 (08 May 2016)"
+#define Module_LibraryVersionInfo       "5:89"
diff --git a/kernel/s/k_body b/kernel/s/k_body
index 706519b0a40bad8268b9943000928ff5ee037fd2..0dab27dd5c8e03d969e5c1e6db67abeabfbea2df 100644
--- a/kernel/s/k_body
+++ b/kernel/s/k_body
@@ -270,21 +270,29 @@ uwb_size        #       0
  [ {CONFIG}=26
         BICS    pc, lr, #PSRIBit        ; 32-bit OK - in {CONFIG}=26
  |
+   [ NoARMv6
         MRS     ip, CPSR
         BIC     ip, ip, #PSR32IBit
         MSR     CPSR_c, ip
+   |
+        CPSIE   i
+   ]
         Return  ,LinkNotStacked
  ]
 
 |_kernel_irqs_off|
-      [ {CONFIG}=26
+ [ {CONFIG}=26
         ORRS    pc, lr, #PSRIBit
-      |
+ |
+   [ NoARMv6
         MRS     ip, CPSR
         ORR     ip, ip, #PSR32IBit
         MSR     CPSR_c, ip
+   |
+        CPSID   i
+   ]
         Return  ,LinkNotStacked
-      ]
+ ]
 
 |_kernel_processor_mode|
       [ {CONFIG}=26
@@ -3132,7 +3140,7 @@ Sleep
 |x$udivide|
 ; Unsigned divide of a2 by a1: returns quotient in a1, remainder in a2
 ; Destroys a3 and ip
-
+      [ NoARMVE
         MOV     a3, #0
         RSBS    ip, a1, a2, LSR #3
         BCC     u_sh2
@@ -3180,6 +3188,14 @@ u_sh0   RSBS    ip, a1, a2
         ADCS    a3, a3, a3
         BCS     u_loop
         MOV     a1, a3
+      |
+; Long delay on UDIV result makes it faster to divide and then check for error
+        UDIV    a3, a2, a1
+        TEQ     a1, #0
+        BEQ     dividebyzero
+        MLS     a2, a3, a1, a2
+        MOV     a1, a3
+      ]
         Return  ,LinkNotStacked
 
 
@@ -3200,6 +3216,7 @@ u_sh0   RSBS    ip, a1, a2
 
 |__rt_udiv10|
 |_kernel_udiv10|
+      [ NoARMM
         SUB     a2, a1, #10
         SUB     a1, a1, a1, LSR #2
         ADD     a1, a1, a1, LSR #4
@@ -3210,6 +3227,16 @@ u_sh0   RSBS    ip, a1, a2
         SUBS    a2, a2, a3, LSL #1
         ADDPL   a1, a1, #1
         ADDMI   a2, a2, #10
+      |
+; For small numbers, UDIV would be faster than this, but not enough to make it
+; worth dynamically switching between algorithms.
+        LDR     a2, =&CCCCCCCD ; (8^32) / 10
+        UMULL   ip, a3, a2, a1
+        MOV     a3, a3, LSR #3 ; Accurate division by 10
+        SUB     a2, a1, a3, LSL #1
+        MOV     a1, a3
+        SUB     a2, a2, a3, LSL #3
+      ]
         Return  ,LinkNotStacked
 
 
@@ -3220,6 +3247,7 @@ u_sh0   RSBS    ip, a1, a2
 ; Quotient is truncated (rounded towards zero).
 ; Sign of remainder = sign of dividend.
 ; Destroys a3, a4 and ip
+      [ NoARMVE
 ; Negates dividend and divisor, then does an unsigned divide; signs
 ; get sorted out again at the end.
 
@@ -3275,6 +3303,13 @@ s_sh0   RSBS    ip, a1, a2
         EORS    a1, a3, a4, ASR #31
         ADD     a1, a1, a4, LSR #31
         RSBCS   a2, a2, #0
+      |
+        SDIV    a3, a2, a1
+        TEQ     a1, #0
+        BEQ     dividebyzero
+        MLS     a2, a3, a1, a2
+        MOV     a1, a3
+      ]
         Return  ,LinkNotStacked
 
 ; Signed remainder of a2 by a1: returns remainder in a1
@@ -3292,6 +3327,7 @@ s_sh0   RSBS    ip, a1, a2
 
 |__rt_sdiv10|
 |_kernel_sdiv10|
+      [ NoARMM
         MOVS    a4, a1
         RSBMI   a1, a1, #0
         SUB     a2, a1, #10
@@ -3307,6 +3343,19 @@ s_sh0   RSBS    ip, a1, a2
         MOVS    a4, a4
         RSBMI   a1, a1, #0
         RSBMI   a2, a2, #0
+      |
+; Using SMULL here would be tricky due to the need to round towards zero
+        MOVS    a4, a1
+        LDR     a2, =&CCCCCCCD ; (8^32) / 10
+        RSBMI   a1, a1, #0
+        UMULL   ip, a3, a2, a1
+        MOV     a3, a3, LSR #3 ; Accurate division by 10
+        SUB     a2, a1, a3, LSL #1
+        MOV     a1, a3
+        SUB     a2, a2, a3, LSL #3
+        RSBMI   a1, a1, #0
+        RSBMI   a2, a2, #0
+      ]
         Return  ,LinkNotStacked
 
         EXPORT  __rt_div0