source: trunk/source/level-0/X86/X8632/x8632-hash.lisp @ 10815

Last change on this file since 10815 was 10815, checked in by rme, 12 years ago

FAST-MOD: The remainder in %edx will be fixnum-tagged, so skip the
mark-as-imm/mark-as-node dance.

File size: 3.8 KB
Line 
1(in-package "CCL")
2
3(eval-when (:compile-toplevel :execute)
4  (require "HASHENV" "ccl:xdump;hashenv"))
5
6;;; This should stay in LAP so that it's fast
7;;; Equivalent to cl:mod when both args are positive fixnums
8(defx8632lapfunction fast-mod ((number arg_y) (divisor arg_z))
9  (xorl (% edx) (% edx))                ;aka temp1
10  (mov (% number) (% imm0))
11  (div (% divisor))                     ;boxed remainder goes into edx/temp1
12  (mov (% edx) (% arg_z))
13  (single-value-return))
14
15;; Faster mod based on Bruce Hoult's Dylan version, modified to use a
16;; branch-free max.
17(defx8632lapfunction fast-mod-3 ((number 4) #|(ra 0)|# (divisor arg_y) (recip arg_z))
18  (std)                                 ;temp1 now unboxed
19  (let ((imm1 temp1)
20        (n temp0))
21    (movl (@ number (% esp)) (% n))
22    (movl (% n) (% imm0))
23    (shrl ($ target::fixnumshift) (% imm0)) ;logical shift is intentional
24    (mov (% recip) (% imm1))
25    (mul (% imm1)) ;; -> hi word in imm1 (unboxed)
26    (mov (% divisor) (% imm0))
27    (mul (% imm1)) ;; -> lo word in imm0 (boxed)
28    (subl (% imm0) (% n))
29    (subl (% divisor) (% n))
30    (mov (% n) (% arg_z))
31    (mov (% n) (% imm0))
32    (sar ($ (1- target::nbits-in-word)) (% imm0))
33    (andl (% imm0) (% divisor))
34    (addl (% divisor) (% arg_z)))
35  (xorl (% temp1) (% temp1))
36  (cld)                                 ;temp1 now boxed
37  (single-value-return 3))
38
39(defx8632lapfunction %dfloat-hash ((key arg_z))
40  (movl (@ x8632::double-float.value (% key)) (% imm0))
41  (addl (@ x8632::double-float.val-high (% key)) (% imm0))
42  (box-fixnum imm0 arg_z)
43  (single-value-return))
44
45(defx8632lapfunction %sfloat-hash ((key arg_z))
46  (movl (@ x8632::single-float.value (% key)) (% imm0))
47  (box-fixnum imm0 arg_z)
48  (single-value-return))
49
50(defx8632lapfunction %macptr-hash ((key arg_z))
51  (movl (@ x8632::macptr.address (% key)) (% imm0))
52  (box-fixnum imm0 temp0)
53  (shll ($ (- 24 x8632::fixnumshift)) (% temp0))
54  (addl (% temp0) (% imm0))
55  (movl ($ (lognot x8632::fixnummask)) (% arg_z))
56  (andl (% imm0) (% arg_z))
57  (single-value-return))
58
59(defx8632lapfunction %bignum-hash ((key arg_z))
60  (mark-as-imm temp1)
61  (let ((header imm0)
62        (offset temp1)
63        (ndigits temp0))
64    (getvheader key header)
65    (header-length header ndigits)
66    (xorl (% offset) (% offset))
67    (let ((immhash header))
68      @loop
69      (roll ($ 13) (% immhash))
70      (addl (@ x8632::misc-data-offset (% key) (% offset)) (% immhash))
71      (addl ($ 4) (% offset))
72      (subl ($ '1) (% ndigits))
73      (jne @loop)
74      (box-fixnum immhash arg_z)))
75  (mark-as-node temp1)
76  (single-value-return))
77
78(defx8632lapfunction %get-fwdnum ()
79  (ref-global target::fwdnum arg_z)
80  (single-value-return))
81
82(defx8632lapfunction %get-gc-count ()
83  (ref-global target::gc-count arg_z)
84  (single-value-return))
85
86;;; Setting a key in a hash-table vector needs to
87;;; ensure that the vector header gets memoized as well
88(defx8632lapfunction %set-hash-table-vector-key ((vector 4) #|(ra 0)|# (index arg_y) (value arg_z))
89  (pop (% temp1))                       ;return address
90  (pop (% temp0))                       ;.SPset-hash-key wants arg in temp0
91  (discard-reserved-frame)
92  (push (% temp1))
93  (jmp-subprim .SPset-hash-key))
94
95;;; This needs to be done out-of-line, to handle EGC memoization.
96(defx8632lapfunction %set-hash-table-vector-key-conditional ((offset 8)
97                                                             (vector 4)
98                                                             #|(ra 0)|#
99                                                             (old arg_y)
100                                                             (new arg_z))
101  (movl (@ offset (% esp)) (% temp0))
102  (movl (@ vector (% esp)) (% temp1))
103  (save-simple-frame)
104  (call-subprim .SPset-hash-key-conditional)
105  (restore-simple-frame)
106  (single-value-return 4))
107
108
109;;; Strip the tag bits to turn x into a fixnum
110(defx8632lapfunction strip-tag-to-fixnum ((x arg_z))
111  (andb ($ (lognot x8632::fixnummask)) (%b x))
112  (single-value-return))
113
Note: See TracBrowser for help on using the repository browser.