source: release/1.4/source/level-0/X86/x86-numbers.lisp @ 13535

Last change on this file since 13535 was 13535, checked in by rme, 10 years ago

Merge r13529 through r13532 (special-case divisor of -1 in %fixnum-truncate)
from trunk to 1.4 branch. Fixes ticket:666.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 5.3 KB
Line 
1;-*- Mode: Lisp; Package: CCL -*-
2;;;
3;;;   Copyright (C) 2009 Clozure Associates
4;;;   Copyright (C) 1994-2001 Digitool, Inc
5;;;   This file is part of Clozure CL. 
6;;;
7;;;   Clozure CL is licensed under the terms of the Lisp Lesser GNU Public
8;;;   License , known as the LLGPL and distributed with Clozure CL as the
9;;;   file "LICENSE".  The LLGPL consists of a preamble and the LGPL,
10;;;   which is distributed with Clozure CL as the file "LGPL".  Where these
11;;;   conflict, the preamble takes precedence. 
12;;;
13;;;   Clozure CL is referenced in the preamble as the "LIBRARY."
14;;;
15;;;   The LLGPL is also available online at
16;;;   http://opensource.franz.com/preamble.html
17
18
19
20(in-package "CCL")
21#+x8664-target
22(progn
23
24
25
26(defx86lapfunction %fixnum-signum ((number arg_z))
27  (movq ($ '-1) (% arg_x))
28  (movq ($ '1) (% arg_y))
29  (testq (% number) (% number))
30  (cmovsq (% arg_x) (% arg_z))
31  (cmovnsq (% arg_y) (% arg_z))
32  (single-value-return))
33
34;;; see %logcount.
35(defx86lapfunction %ilogcount ((number arg_z))
36  (let ((rshift imm0)
37        (temp imm1))
38    (unbox-fixnum number rshift)
39    (xorq (% arg_z) (% arg_z))
40    (testq (% rshift) (% rshift))
41    (jmp @test)
42    @next
43    (lea (@ -1 (% rshift)) (% temp))
44    (and (% temp) (% rshift))            ; sets flags
45    (lea (@ '1 (% arg_z)) (% arg_z))    ; doesn't set flags
46    @test
47    (jne @next)
48    (single-value-return)))
49
50(defx86lapfunction %iash ((number arg_y) (count arg_z))
51  (unbox-fixnum count imm1)
52  (unbox-fixnum number imm0)
53  (xorq (% rcx) (% rcx))                ;rcx = imm2
54  (testq (% count) (% count))
55  (jge @left)
56  (subb (% imm1.b) (% cl))
57  (sar (% cl) (% imm0))
58  (box-fixnum imm0 arg_z)
59  (single-value-return)
60  @left
61  (movb (% imm1.b) (% cl))
62  (shl (% cl) (% number))
63  (movq (% number) (% arg_z))
64  (single-value-return))
65
66(defparameter *double-float-zero* 0.0d0)
67(defparameter *short-float-zero* 0.0s0)
68
69
70(defx86lapfunction %fixnum-intlen ((number arg_z))
71  (unbox-fixnum arg_z imm0)
72  (movq (% imm0) (% imm1))
73  (notq (% imm1))
74  (testq (% imm0) (% imm0))
75  (cmovsq (% imm1) (% imm0))
76  (bsrq (% imm0) (% imm0))
77  (setne (% imm1.b))
78  (addb (% imm1.b) (% imm0.b))
79  (box-fixnum imm0 arg_z)
80  (single-value-return))
81
82
83;;; Caller guarantees that result fits in a fixnum.
84
85(defx86lapfunction %truncate-double-float->fixnum ((arg arg_z))
86  (get-double-float arg fp1)
87  (cvttsd2si (% fp1) (% imm0))
88  (box-fixnum imm0 arg_z) 
89  (single-value-return))
90
91
92(defx86lapfunction %truncate-short-float->fixnum ((arg arg_z))
93  (get-single-float arg fp1)
94  (cvttss2si (% fp1) (% imm0))
95  (box-fixnum imm0 arg_z) 
96  (single-value-return))
97
98;;; DOES round to even
99
100(defx86lapfunction %round-nearest-double-float->fixnum ((arg arg_z))
101  (get-double-float arg fp1)
102  (cvtsd2si (% fp1) (% imm0))
103  (box-fixnum imm0 arg_z) 
104  (single-value-return))
105
106
107(defx86lapfunction %round-nearest-short-float->fixnum ((arg arg_z))
108  (get-single-float arg fp1)
109  (cvtss2si (% fp1) (% imm0))
110  (box-fixnum imm0 arg_z) 
111  (single-value-return))
112
113
114
115;;; We'll get a SIGFPE if divisor is 0.
116;;; Don't use %rbp.  Trust callback_for_interrupt() to preserve
117;;; the word below the stack pointer
118(defx86lapfunction %fixnum-truncate ((dividend arg_y) (divisor arg_z))
119  (save-simple-frame)
120  (cmpq ($ '-1) (% divisor))
121  (je @neg)
122  (unbox-fixnum divisor imm0)
123  (movq (% imm0) (% imm2))
124  (unbox-fixnum dividend imm0)
125  (cqto)                                ; imm1 := sign_extend(imm0)
126  (idivq (% imm2))
127  (pop (% rbp))
128  (movq (% rsp) (% temp0))
129  (box-fixnum imm1 arg_y)
130  (box-fixnum imm0 arg_z)
131  (pushq (% arg_z))
132  (pushq (% arg_y))
133  (set-nargs 2)
134  (jmp-subprim .SPvalues)
135  @neg
136  (negq (% dividend))
137  (load-constant *least-positive-bignum* arg_z)
138  (cmovoq (@ x8664::symbol.vcell (% arg_z)) (% dividend))
139  (pop (% rbp))
140  (movq (% rsp) (% temp0))
141  (pushq (% dividend))
142  (pushq ($ 0))
143  (set-nargs 2)
144  (jmp-subprim .SPvalues))
145 
146
147(defx86lapfunction called-for-mv-p ()
148  (ref-global ret1valaddr imm0)
149  (movq (@ x8664::lisp-frame.return-address (% rbp)) (% imm1))
150  (cmpq (% imm0) (% imm1))
151  (movq ($ t) (% imm0))
152  (movq ($ nil) (% arg_z))
153  (cmoveq (% imm0) (% arg_z))
154  (single-value-return))
155
156
157;;; n1 and n2 must be positive (esp non zero)
158(defx86lapfunction %fixnum-gcd ((boxed-u arg_y) (boxed-v arg_z))
159  (let ((u imm0)
160        (v imm1)
161        (k imm2))
162    (xorl (% imm2.l) (% imm2.l))
163    (bsfq (% boxed-u) (% u))
164    (bsfq (% boxed-v) (% v))
165    (rcmp (% u) (% v))
166    (cmovlel (%l u) (%l k))
167    (cmovgl (%l v) (%l k))
168    (unbox-fixnum boxed-u u)
169    (unbox-fixnum boxed-v v)
170    (subb ($ x8664::fixnumshift) (%b k))
171    (jz @start)
172    (shrq (% cl) (% u))
173    (shrq (% cl) (% v))
174    @start
175    ;; At least one of u or v is odd at this point
176    @loop
177    ;; if u is even, shift it right one bit
178    (testb ($ 1) (%b u))
179    (jne @u-odd)
180    (shrq ($ 1) (% u))
181    (jmp @test)
182    @u-odd
183    ;; if v is even, shift it right one bit
184    (testb ($ 1) (%b v))
185    (jne @both-odd)
186    (shrq ($ 1) (% v))
187    (jmp @test-u)
188    @both-odd
189    (cmpq (% v) (% u))
190    (jb @v>u)
191    (subq (% v) (% u))
192    (shrq ($ 1) (% u))
193    (jmp @test)
194    @v>u
195    (subq (% u) (% v))
196    (shrq ($ 1) (% v))
197    @test-u
198    (testq (% u) (% u))
199    @test
200    (ja @loop)
201    (shlq (% cl) (% v))
202    (movb ($ 0) (% cl))
203    (box-fixnum v arg_z)
204    (single-value-return)))
205
206
207
208;;; End of x86-numbers.lisp
209) ; #+x8664-target
Note: See TracBrowser for help on using the repository browser.