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

Last change on this file since 9932 was 9932, checked in by gb, 12 years ago

One FAST-MOD implementation; conditionalize for word size inside it.

Add a FAST-MOD-3 for PPC, based on gz's implementation. (Integer
divide on PPC is slow as a dog, multiply's not that bad.)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 4.1 KB
Line 
1;;; -*- Mode: Lisp; Package: CCL -*-
2;;;
3;;;   Copyright (C) 1994-2001 Digitool, Inc
4;;;   This file is part of OpenMCL. 
5;;;
6;;;   OpenMCL is licensed under the terms of the Lisp Lesser GNU Public
7;;;   License , known as the LLGPL and distributed with OpenMCL as the
8;;;   file "LICENSE".  The LLGPL consists of a preamble and the LGPL,
9;;;   which is distributed with OpenMCL as the file "LGPL".  Where these
10;;;   conflict, the preamble takes precedence. 
11;;;
12;;;   OpenMCL is referenced in the preamble as the "LIBRARY."
13;;;
14;;;   The LLGPL is also available online at
15;;;   http://opensource.franz.com/preamble.html
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  (unbox-fixnum imm0 number)
45  #+ppc32-target
46  (progn
47    (mulhw imm1 imm0 recip)
48    (mullw imm0 imm1 divisor))
49  #+ppc64-target
50  (progn
51    (mulhd imm1 imm0 recip)
52    (mulld imm0 imm1 divisor))
53  (sub number number imm0)
54  (sub number number divisor)
55  (srari imm0 number (1- target::nbits-in-word))
56  (and divisor divisor imm0)
57  (add arg_z number divisor)
58  (blr))
59
60#+ppc32-target
61(defppclapfunction %dfloat-hash ((key arg_z))
62  (lwz imm0 ppc32::double-float.value key)
63  (lwz imm1 ppc32::double-float.val-low key)
64  (add imm0 imm0 imm1)
65  (box-fixnum arg_z imm0)
66  (blr))
67
68#+ppc64-target
69(defppclapfunction %dfloat-hash ((key arg_z))
70  (ld imm0 ppc64::double-float.value key)
71  (box-fixnum arg_z imm0)
72  (blr))
73
74#+ppc32-target
75(defppclapfunction %sfloat-hash ((key arg_z))
76  (lwz imm0 ppc32::single-float.value key)
77  (box-fixnum arg_z imm0)
78  (blr))
79
80#+ppc64-target
81(defppclapfunction %sfloat-hash ((key arg_z))
82  (lis imm0 #x8000)
83  (srdi imm1 key 32)
84  (cmpw imm0 imm1)
85  (srdi arg_z key (- 32 ppc64::fixnumshift))
86  (bnelr)
87  (li arg_z 0)
88  (blr))
89
90(defppclapfunction %macptr-hash ((key arg_z))
91  (ldr imm0 target::macptr.address key)
92  (slri imm1 imm0 24)
93  (add imm0 imm0 imm1)
94  (clrrri arg_z imm0 target::fixnumshift)
95  (blr))
96
97#+ppc32-target
98(defppclapfunction %bignum-hash ((key arg_z))
99  (let ((header imm3)
100        (offset imm2)
101        (ndigits imm1)
102        (immhash imm0))
103    (li immhash 0)
104    (li offset ppc32::misc-data-offset)
105    (getvheader header key)
106    (header-size ndigits header)
107    (let ((next header))
108      @loop
109      (cmpwi cr0 ndigits 1)
110      (subi ndigits ndigits 1)
111      (lwzx next key offset)
112      (addi offset offset 4)
113      (rotlwi immhash immhash 13)
114      (add immhash immhash next)
115      (bne cr0 @loop))
116    (clrrwi arg_z immhash ppc32::fixnumshift)
117    (blr)))
118
119#+ppc64-target
120(defppclapfunction %bignum-hash ((key arg_z))
121  (let ((header imm3)
122        (offset imm2)
123        (ndigits imm1)
124        (immhash imm0))
125    (li immhash 0)
126    (li offset ppc64::misc-data-offset)
127    (getvheader header key)
128    (header-size ndigits header)
129    (let ((next header))
130      @loop
131      (cmpdi cr0 ndigits 1)
132      (subi ndigits ndigits 1)
133      (lwzx next key offset)
134      (rotldi immhash immhash 13)
135      (addi offset offset 4)
136      (add immhash immhash next)
137      (bne cr0 @loop))
138    (clrrdi arg_z immhash ppc64::fixnumshift)
139    (blr)))
140
141
142(defppclapfunction %get-fwdnum ()
143  (ref-global arg_z target::fwdnum)
144  (blr))
145
146
147(defppclapfunction %get-gc-count ()
148  (ref-global arg_z target::gc-count)
149  (blr))
150
151
152;;; Setting a key in a hash-table vector needs to
153;;; ensure that the vector header gets memoized as well
154(defppclapfunction %set-hash-table-vector-key ((vector arg_x) (index arg_y) (value arg_z))
155  (ba .SPset-hash-key))
156
157;;; Strip the tag bits to turn x into a fixnum
158(defppclapfunction strip-tag-to-fixnum ((x arg_z))
159  (unbox-fixnum imm0 x)
160  (box-fixnum arg_z imm0)
161  (blr))
162
163;;; end of ppc-hash.lisp
Note: See TracBrowser for help on using the repository browser.