Index: /branches/arm/level-0/ARM/arm-bignum.lisp
===================================================================
--- /branches/arm/level-0/ARM/arm-bignum.lisp	(revision 13818)
+++ /branches/arm/level-0/ARM/arm-bignum.lisp	(revision 13819)
@@ -984,5 +984,4 @@
     (bx lr)))
 
-#+notyet
 (defarmlapfunction %normalize-bignum-2 ((fixp arg_y)(res arg_z))
   (let ((idx imm0)
@@ -991,61 +990,57 @@
         (len arg_x)
         (oldlen temp0))
-    (ldr imm4 res (:$ (- arm::fulltag-misc)))
-    (header-length len imm4)
-    (cmpwi len 0)
-    (mr oldlen len)
-    (addi idx len (- arm::misc-data-offset 4))  
-    (beqlr) ; huh - can this ever happen?
+    (vector-length len res imm0)
+    (cmp len (:$ 0))
+    (mov oldlen len)
+    (add idx len (:$ (- arm::misc-data-offset 4))  )
+    (bxeq lr) ; huh - can this ever happen?
     (ldr val (:@ res idx)) ; high order word
-    (srawi usign val 31) ; get sign
+    (mov usign (:asr val (:$ 31))) ; get sign
     @loop
     (ldr val (:@ res idx))
-    (cmpw  val usign)    
-    (subi idx idx '1)
+    (cmp  val usign)    
+    (sub idx idx '1)
     (bne @neq)    
-    (subic. len len '1)
+    (subs len len '1)
     (bgt @loop)
     ; fall through - its all sign - return 1
-    (li len '1)
-    (rlwinm usign usign 0 0 0) ; hi bit
+    (mov len '1)
+    (and usign usign (:$ #x80000000))
     (b @more)
     @neq
-    (rlwinm usign usign 0 0 0) ; hi bit
-    (rlwinm val val 0 0 0)
-    (cmpw usign val)  ; is hi bit = sign, if so then done   
+    (and usign usign (:$ #x80000000))
+    (and val val (:$ #x80000000))
+    (cmp usign val)  ; is hi bit = sign, if so then done   
     (beq @more)
-    (addi len len '1) ; if not, need 1 more
+    (add len len '1) ; if not, need 1 more
     (b @big)
     @more
-    (cmpwi :cr1 fixp arm::nil-value)
-    (cmpwi len '1)
-    (beq :cr1 @big)  ; dont return fixnum
+    (cmp  fixp 'nil)
+    (beq @big)                          ; dont return fixnum
+    (cmp len '1)
     (bgt @big)
     ;; stuff for maybe fixnum
     ;(dbg t)
-    (ldr val res (:$ arm::misc-data-offset))
-    (rlwinm imm4 val 0 0 2) ; hi 3 bits same? - we assume fixnumshift is 2
-    (srawi usign usign 2)
-    (cmpw usign imm4)
-    (bne @big)    
+    (ldr val (:@ res (:$ arm::misc-data-offset)))
     (box-fixnum arg_z val)
-    (bx lr)
+    (cmp val (:asr arg_z (:$ arm::fixnumshift)))
+    (bxeq lr)
     @big
-    (cmpw oldlen len)
-    (beqlr) ; same length - done
-    (li imm4 arm::subtag-bignum) ; set new length
-    (rlwimi imm4 len (- arm::num-subtag-bits arm::fixnumshift) 0 (- 31 arm::num-subtag-bits))
-    (str imm4 res  (:$ arm::misc-header-offset))
-    ; 0 to tail if negative
-    (cmpwi usign 0)
-    (beqlr) 
-     ; zero from len inclusive to oldlen exclusive
-    ;(dbg t)
-    (addi idx len arm::misc-data-offset)
+    (cmp oldlen len)
+    (bxeq lr) ; same length - done
+    (mov imm2 (:$ arm::subtag-bignum))
+    (cmp usign (:$ 0))
+    (orr imm2 imm2 (:lsl len (:$ (- arm::num-subtag-bits arm::fixnumshift))))
+    (str imm2 (:@ res (:$ arm::misc-header-offset)))
+    ;; 0 to tail if negative
+    (bxeq lr) 
+    ;; zero from len inclusive to oldlen exclusive
+    (mov temp0 (:$ 0))
+    (add idx len (:$ arm::misc-data-offset))
     @loop2
-    (str rzero (:@ idx res))
-    (addi len len '1)
-    (cmpw len oldlen)
-    (addi idx idx '1)
+    (str temp0 (:@ idx res))
+    (add len len '1)
+    (cmp len oldlen)
+    (add idx idx '1)
     (blt @loop2)
     (bx lr)))
@@ -1127,5 +1122,37 @@
     (str header (:@ bignum  (:$ arm::misc-header-offset)))
     (bx lr)))
+
+;;; Divide bignum x by single digit y (passed as two halves).
+;;; The quotient in stored in q, and the remainder is returned
+;;; in two halves.  (cf. Knuth, 4.3.1, exercise 16)
+(defarmlapfunction %floor-loop-quo ((x 0) (res arg_x) (yhi arg_y) (ylo arg_z))
+  (let ((bignum temp0)
+        (len temp2))                    ;not nfn here.
+    (ldr bignum (:@ vsp (:$ x)))
+    (add imm1 vsp (:$ arm::node-size))
+    (build-lisp-frame imm0 imm1)
+    (vector-length len bignum imm0)
+    (mov imm2 (:$ 0))
+    (b @next)
+    @loop
+    (add imm0 len (:$ arm::misc-data-offset))
+    (ldr imm0 (:@ bignum imm0))
+    (mov imm1 imm2)
+    (compose-digit imm2 yhi ylo)
+    (bl .SPudiv64by32)
+    (add imm1 len (:$ arm::misc-data-offset))
+    (str imm0 (:@ res imm1))
+    @next
+    (subs len len '1)
+    (bge @loop)
+    (digit-h yhi imm2)
+    (digit-l ylo imm2)
+    (vpush1 yhi)
+    (vpush1 ylo)
+    (set-nargs 2)
+    (ba .SPnvalret)))
     
+    
+
 
 ; End of arm-bignum.lisp
