Index: /branches/arm/level-0/ARM/arm-numbers.lisp
===================================================================
--- /branches/arm/level-0/ARM/arm-numbers.lisp	(revision 13856)
+++ /branches/arm/level-0/ARM/arm-numbers.lisp	(revision 13857)
@@ -242,106 +242,86 @@
 
 
-#+notyet
 (defarmlapfunction %mrg31k3p ((state arg_z))
-  (let ((seed temp0))
+  (let ((seed temp0)
+	(m1 #x7fffffff))
     (svref seed 1 state)
     (u32-ref imm0 1 seed)
-    (u32-ref imm3 2 seed)
-    (rlwinm imm1 imm0 22 1 9)
-    (srwi imm2 imm0 9)
-    (add imm0 imm1 imm2)
-    
-    ;; construct m1 (1- (expt 2 31))
-    (lis imm1 #x7fff)
-    (ori imm1 imm1 #xffff)
-
-    (rlwinm imm4 imm3 7 1 24)
-    (srwi imm5 imm3 24)
-    (add imm0 imm0 imm4)
-    (add imm0 imm0 imm5)
-
-    ;; reduce mod m1
-    (cmplw cr7 imm0 imm1)
-    (blt cr7 @ok1)
-    (sub imm0 imm0 imm1)
-    @ok1
-
-    (add imm0 imm0 imm3)
-
-    ;; reduce mod m1
-    (cmplw cr7 imm0 imm1)
-    (blt cr7 @ok2)
-    (sub imm0 imm0 imm1)
-    @ok2
-
-    ;; update state
-    (u32-ref imm1 1 seed)
-    (u32-set imm1 2 seed)
-    (u32-ref imm1 0 seed)
-    (u32-set imm1 1 seed)
-    (u32-set imm0 0 seed)
-
-    ;; construct m2 (- (expt 2 31) 21069))
-    (lis imm5 #x7fff)
-    (ori imm5 imm5 44467)
+
+    (mov imm1 (:lsr imm0 (:$ 9)))
+    (mov imm2 (:lsl imm0 (:$ 23)))	;get low 9 bits
+    (mov imm2 (:lsr imm2 (:$ 23)))
+    (add imm1 imm1 (:lsl imm2 (:$ 22)))
+
+    (u32-ref imm0 2 seed)
+    (add imm1 imm1 (:lsr imm0 (:$ 24)))
+    (bic imm2 imm0 (:$ #xff000000))
+    (add imm1 imm1 (:lsl imm2 (:$ 7)))
+
+    (cmp imm1 (:$ m1))
+    (subhi imm1 imm1 (:$ m1))
+
+    (add imm1 imm1 imm0)
+    (cmp imm1 (:$ m1))
+    (subhi imm1 imm1 (:$ m1))
+
+    (u32-ref imm0 1 seed)
+    (u32-set imm0 2 seed)
+    (u32-ref imm0 0 seed)
+    (u32-set imm0 1 seed)
+    (u32-set imm1 0 seed)
 
     ;; second component
     (u32-ref imm0 3 seed)
-    (rlwinm imm1 imm0 15 1 16)
-    (srwi imm2 imm0 16)
-    (mulli imm2 imm2 21069)
-    (add imm0 imm1 imm2)
-
-    ;; reduce mod m2
-    (cmplw cr7 imm0 imm5)
-    (blt cr7 @ok3)
-    (sub imm0 imm0 imm5)
-    @ok3
-
-    (u32-ref imm1 5 seed)
-    (rlwinm imm2 imm1 15 1 16)
-    (srwi imm3 imm1 16)
-    (mulli imm3 imm3 21069)
-    (add imm2 imm2 imm3)
-
-    ;; reduce mod m2
-    (cmplw cr7 imm2 imm5)
-    (blt cr7 @ok4)
-    (sub imm2 imm2 imm5)
-    @ok4
-
-    (add imm2 imm1 imm2)
-    (cmplw cr7 imm2 imm5)
-    (blt cr7 @ok5)
-    (sub imm2 imm2 imm5)
-    @ok5
-
-    (add imm2 imm2 imm0)
-    (cmplw cr7 imm2 imm5)
-    (blt cr7 @ok6)
-    (sub imm2 imm2 imm5)
-    @ok6
-
-    ;; update state
+    (mov imm1 (:$ 20992))
+    (add imm1 imm1 (:$ 77))
+    (mov imm2 (:lsr imm0 (:$ 16)))
+    (mul imm2 imm1 imm2)
+    (mov imm0 (:lsl imm0 (:$ 16)))
+    (add imm0 imm2 (:lsr imm0 (:$ 1)))
+
+    (ldr imm2 (:= @m2))
+    (cmp imm0 imm2)
+    (subhi imm0 imm0 imm2)
+
+    (vpush1 rcontext)
+    (mov rcontext imm0)			;save t1
+
+    (u32-ref imm0 5 seed)
+    (mov imm2 (:lsr imm0 (:$ 16)))
+    (mul imm2 imm1 imm2)		;21069 still in imm1
+    (mov imm1 (:lsl imm0 (:$ 16)))
+    (add imm1 imm2 (:lsr imm1 (:$ 1)))
+
+    (ldr imm2 (:= @m2))
+    (cmp imm1 imm2)
+    (subhi imm1 imm1 imm2)
+
+    (add imm1 imm1 imm0)
+    (cmp imm1 imm2)
+    (subhi imm1 imm1 imm2)
+
+    (add imm1 imm1 rcontext)		;add in t1 from back when
+    (vpop1 rcontext)
+    (cmp imm1 imm2)
+    (subhi imm1 imm1 imm2)
+
     (u32-ref imm0 4 seed)
     (u32-set imm0 5 seed)
     (u32-ref imm0 3 seed)
     (u32-set imm0 4 seed)
-    (u32-set imm2 3 seed)
-
-    ;; construct m1 (1- (expt 2 31))
-    (lis imm5 #x7fff)
-    (ori imm5 imm5 #xffff)
+    (u32-set imm1 3 seed)
 
     ;; combination
     (u32-ref imm0 0 seed)
-    (cmplw cr7 imm0 imm2)
-    (sub imm0 imm0 imm2)
-    (bgt cr7 @finish)
-    (add imm0 imm0 imm5)
-    @finish
-    (bic imm0 imm0 (:$ #xe0000000))		;don't want negative fixnums
-    (box-fixnum arg_z imm0)
-    (blr)))    
+    (sub imm2 imm0 imm1)
+    (cmp imm0 imm1)
+    (addls imm2 imm2 (:$ m1))
+    (bic imm2 imm2 (:$ #xe0000000))	;avoid negative fixnums
+    (box-fixnum arg_z imm2)
+    (bx lr))
+  
+  (:data)
+  @m2
+  (:word 2147462579))
 
 ; End of arm-numbers.lisp
