Changeset 13857


Ignore:
Timestamp:
Jun 18, 2010, 1:36:23 AM (9 years ago)
Author:
rme
Message:

%mrg31k3p in ARM LAP. Maybe it will even work.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/arm/level-0/ARM/arm-numbers.lisp

    r13806 r13857  
    242242
    243243
    244 #+notyet
    245244(defarmlapfunction %mrg31k3p ((state arg_z))
    246   (let ((seed temp0))
     245  (let ((seed temp0)
     246        (m1 #x7fffffff))
    247247    (svref seed 1 state)
    248248    (u32-ref imm0 1 seed)
    249     (u32-ref imm3 2 seed)
    250     (rlwinm imm1 imm0 22 1 9)
    251     (srwi imm2 imm0 9)
    252     (add imm0 imm1 imm2)
    253    
    254     ;; construct m1 (1- (expt 2 31))
    255     (lis imm1 #x7fff)
    256     (ori imm1 imm1 #xffff)
    257 
    258     (rlwinm imm4 imm3 7 1 24)
    259     (srwi imm5 imm3 24)
    260     (add imm0 imm0 imm4)
    261     (add imm0 imm0 imm5)
    262 
    263     ;; reduce mod m1
    264     (cmplw cr7 imm0 imm1)
    265     (blt cr7 @ok1)
    266     (sub imm0 imm0 imm1)
    267     @ok1
    268 
    269     (add imm0 imm0 imm3)
    270 
    271     ;; reduce mod m1
    272     (cmplw cr7 imm0 imm1)
    273     (blt cr7 @ok2)
    274     (sub imm0 imm0 imm1)
    275     @ok2
    276 
    277     ;; update state
    278     (u32-ref imm1 1 seed)
    279     (u32-set imm1 2 seed)
    280     (u32-ref imm1 0 seed)
    281     (u32-set imm1 1 seed)
    282     (u32-set imm0 0 seed)
    283 
    284     ;; construct m2 (- (expt 2 31) 21069))
    285     (lis imm5 #x7fff)
    286     (ori imm5 imm5 44467)
     249
     250    (mov imm1 (:lsr imm0 (:$ 9)))
     251    (mov imm2 (:lsl imm0 (:$ 23)))      ;get low 9 bits
     252    (mov imm2 (:lsr imm2 (:$ 23)))
     253    (add imm1 imm1 (:lsl imm2 (:$ 22)))
     254
     255    (u32-ref imm0 2 seed)
     256    (add imm1 imm1 (:lsr imm0 (:$ 24)))
     257    (bic imm2 imm0 (:$ #xff000000))
     258    (add imm1 imm1 (:lsl imm2 (:$ 7)))
     259
     260    (cmp imm1 (:$ m1))
     261    (subhi imm1 imm1 (:$ m1))
     262
     263    (add imm1 imm1 imm0)
     264    (cmp imm1 (:$ m1))
     265    (subhi imm1 imm1 (:$ m1))
     266
     267    (u32-ref imm0 1 seed)
     268    (u32-set imm0 2 seed)
     269    (u32-ref imm0 0 seed)
     270    (u32-set imm0 1 seed)
     271    (u32-set imm1 0 seed)
    287272
    288273    ;; second component
    289274    (u32-ref imm0 3 seed)
    290     (rlwinm imm1 imm0 15 1 16)
    291     (srwi imm2 imm0 16)
    292     (mulli imm2 imm2 21069)
    293     (add imm0 imm1 imm2)
    294 
    295     ;; reduce mod m2
    296     (cmplw cr7 imm0 imm5)
    297     (blt cr7 @ok3)
    298     (sub imm0 imm0 imm5)
    299     @ok3
    300 
    301     (u32-ref imm1 5 seed)
    302     (rlwinm imm2 imm1 15 1 16)
    303     (srwi imm3 imm1 16)
    304     (mulli imm3 imm3 21069)
    305     (add imm2 imm2 imm3)
    306 
    307     ;; reduce mod m2
    308     (cmplw cr7 imm2 imm5)
    309     (blt cr7 @ok4)
    310     (sub imm2 imm2 imm5)
    311     @ok4
    312 
    313     (add imm2 imm1 imm2)
    314     (cmplw cr7 imm2 imm5)
    315     (blt cr7 @ok5)
    316     (sub imm2 imm2 imm5)
    317     @ok5
    318 
    319     (add imm2 imm2 imm0)
    320     (cmplw cr7 imm2 imm5)
    321     (blt cr7 @ok6)
    322     (sub imm2 imm2 imm5)
    323     @ok6
    324 
    325     ;; update state
     275    (mov imm1 (:$ 20992))
     276    (add imm1 imm1 (:$ 77))
     277    (mov imm2 (:lsr imm0 (:$ 16)))
     278    (mul imm2 imm1 imm2)
     279    (mov imm0 (:lsl imm0 (:$ 16)))
     280    (add imm0 imm2 (:lsr imm0 (:$ 1)))
     281
     282    (ldr imm2 (:= @m2))
     283    (cmp imm0 imm2)
     284    (subhi imm0 imm0 imm2)
     285
     286    (vpush1 rcontext)
     287    (mov rcontext imm0)                 ;save t1
     288
     289    (u32-ref imm0 5 seed)
     290    (mov imm2 (:lsr imm0 (:$ 16)))
     291    (mul imm2 imm1 imm2)                ;21069 still in imm1
     292    (mov imm1 (:lsl imm0 (:$ 16)))
     293    (add imm1 imm2 (:lsr imm1 (:$ 1)))
     294
     295    (ldr imm2 (:= @m2))
     296    (cmp imm1 imm2)
     297    (subhi imm1 imm1 imm2)
     298
     299    (add imm1 imm1 imm0)
     300    (cmp imm1 imm2)
     301    (subhi imm1 imm1 imm2)
     302
     303    (add imm1 imm1 rcontext)            ;add in t1 from back when
     304    (vpop1 rcontext)
     305    (cmp imm1 imm2)
     306    (subhi imm1 imm1 imm2)
     307
    326308    (u32-ref imm0 4 seed)
    327309    (u32-set imm0 5 seed)
    328310    (u32-ref imm0 3 seed)
    329311    (u32-set imm0 4 seed)
    330     (u32-set imm2 3 seed)
    331 
    332     ;; construct m1 (1- (expt 2 31))
    333     (lis imm5 #x7fff)
    334     (ori imm5 imm5 #xffff)
     312    (u32-set imm1 3 seed)
    335313
    336314    ;; combination
    337315    (u32-ref imm0 0 seed)
    338     (cmplw cr7 imm0 imm2)
    339     (sub imm0 imm0 imm2)
    340     (bgt cr7 @finish)
    341     (add imm0 imm0 imm5)
    342     @finish
    343     (bic imm0 imm0 (:$ #xe0000000))             ;don't want negative fixnums
    344     (box-fixnum arg_z imm0)
    345     (blr)))   
     316    (sub imm2 imm0 imm1)
     317    (cmp imm0 imm1)
     318    (addls imm2 imm2 (:$ m1))
     319    (bic imm2 imm2 (:$ #xe0000000))     ;avoid negative fixnums
     320    (box-fixnum arg_z imm2)
     321    (bx lr))
     322 
     323  (:data)
     324  @m2
     325  (:word 2147462579))
    346326
    347327; End of arm-numbers.lisp
Note: See TracChangeset for help on using the changeset viewer.