source: trunk/source/level-0/PPC/ppc-hash.lisp

Last change on this file was 16685, checked in by rme, 4 years ago

Update copyright/license headers in files.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 4.5 KB
Line 
1;;; -*- Mode: Lisp; Package: CCL -*-
2;;;
3;;; Copyright 1994-2009 Clozure Associates
4;;;
5;;; Licensed under the Apache License, Version 2.0 (the "License");
6;;; you may not use this file except in compliance with the License.
7;;; You may obtain a copy of the License at
8;;;
9;;;     http://www.apache.org/licenses/LICENSE-2.0
10;;;
11;;; Unless required by applicable law or agreed to in writing, software
12;;; distributed under the License is distributed on an "AS IS" BASIS,
13;;; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14;;; See the License for the specific language governing permissions and
15;;; limitations under the License.
16
17;;; level-0;ppc;ppc-hash.lisp
18
19
20(in-package "CCL")
21
22(eval-when (:compile-toplevel :execute)
23  (require "HASHENV" "ccl:xdump;hashenv"))
24
25
26
27
28;;; This should stay in LAP so that it's fast
29;;; Equivalent to cl:mod when both args are positive fixnums
30(defppclapfunction fast-mod ((number arg_y) (divisor arg_z))
31  #+ppc32-target
32  (progn
33    (divwu imm0 number divisor)
34    (mullw arg_z imm0 divisor))
35  #+ppc64-target
36  (progn
37    (divdu imm0 number divisor)
38    (mulld arg_z imm0 divisor))
39  (subf arg_z arg_z number)
40  (blr))
41
42
43(defppclapfunction fast-mod-3 ((number arg_x) (divisor arg_y) (recip arg_z))
44  #+ppc32-target
45  (progn
46    (srwi imm0 number ppc32::fixnumshift)
47    (mulhw imm1 imm0 recip)
48    (mullw imm0 imm1 divisor))
49  #+ppc64-target
50  (progn
51    (srdi imm0 number ppc64::fixnumshift)
52    (mulhd imm1 imm0 recip)
53    (mulld imm0 imm1 divisor))
54  (sub number number imm0)
55  (sub number number divisor)
56  (srari imm0 number (1- target::nbits-in-word))
57  (and divisor divisor imm0)
58  (add arg_z number divisor)
59  (blr))
60
61#+ppc32-target
62(defppclapfunction %dfloat-hash ((key arg_z))
63  (lwz imm0 ppc32::double-float.value key)
64  (lwz imm1 ppc32::double-float.val-low key)
65  (add imm0 imm0 imm1)
66  (box-fixnum arg_z imm0)
67  (blr))
68
69#+ppc64-target
70(defppclapfunction %dfloat-hash ((key arg_z))
71  (ld imm0 ppc64::double-float.value key)
72  (box-fixnum arg_z imm0)
73  (blr))
74
75#+ppc32-target
76(defppclapfunction %sfloat-hash ((key arg_z))
77  (lwz imm0 ppc32::single-float.value key)
78  (box-fixnum arg_z imm0)
79  (blr))
80
81#+ppc64-target
82(defppclapfunction %sfloat-hash ((key arg_z))
83  (lis imm0 #x8000)
84  (srdi imm1 key 32)
85  (cmpw imm0 imm1)
86  (srdi arg_z key (- 32 ppc64::fixnumshift))
87  (bnelr)
88  (li arg_z 0)
89  (blr))
90
91(defppclapfunction %macptr-hash ((key arg_z))
92  (ldr imm0 target::macptr.address key)
93  (slri imm1 imm0 24)
94  (add imm0 imm0 imm1)
95  (clrrri arg_z imm0 target::fixnumshift)
96  (blr))
97
98#+ppc32-target
99(defppclapfunction %bignum-hash ((key arg_z))
100  (let ((header imm3)
101        (offset imm2)
102        (ndigits imm1)
103        (immhash imm0))
104    (li immhash 0)
105    (li offset ppc32::misc-data-offset)
106    (getvheader header key)
107    (header-size ndigits header)
108    (let ((next header))
109      @loop
110      (cmpwi cr0 ndigits 1)
111      (subi ndigits ndigits 1)
112      (lwzx next key offset)
113      (addi offset offset 4)
114      (rotlwi immhash immhash 13)
115      (add immhash immhash next)
116      (bne cr0 @loop))
117    (clrrwi arg_z immhash ppc32::fixnumshift)
118    (blr)))
119
120#+ppc64-target
121(defppclapfunction %bignum-hash ((key arg_z))
122  (let ((header imm3)
123        (offset imm2)
124        (ndigits imm1)
125        (immhash imm0))
126    (li immhash 0)
127    (li offset ppc64::misc-data-offset)
128    (getvheader header key)
129    (header-size ndigits header)
130    (let ((next header))
131      @loop
132      (cmpdi cr0 ndigits 1)
133      (subi ndigits ndigits 1)
134      (lwzx next key offset)
135      (rotldi immhash immhash 13)
136      (addi offset offset 4)
137      (add immhash immhash next)
138      (bne cr0 @loop))
139    (clrrdi arg_z immhash ppc64::fixnumshift)
140    (blr)))
141
142
143(defppclapfunction %get-fwdnum ()
144  (ref-global arg_z target::fwdnum)
145  (blr))
146
147
148(defppclapfunction %get-gc-count ()
149  (ref-global arg_z target::gc-count)
150  (blr))
151
152
153;;; Setting a key in a hash-table vector needs to
154;;; ensure that the vector header gets memoized as well
155(defppclapfunction %set-hash-table-vector-key ((vector arg_x) (index arg_y) (value arg_z))
156  (ba .SPset-hash-key))
157
158(defppclapfunction %set-hash-table-vector-key-conditional ((offset 0) (vector arg_x) (old arg_y) (new arg_z))
159  (ba .SPset-hash-key-conditional))
160
161;;; Strip the tag bits to turn x into a fixnum
162(defppclapfunction strip-tag-to-fixnum ((x arg_z))
163  (clrlri. imm0 arg_z (- target::nbits-in-word target::fixnumshift))
164  (beq @done)
165  (clrrri arg_z x target::ntagbits)
166  (srri arg_z arg_z (- target::ntagbits target::fixnumshift))
167  @done
168  (blr))
169
170;;; end of ppc-hash.lisp
Note: See TracBrowser for help on using the repository browser.