source: branches/ia32/level-0/X86/X8632/x8632-bignum.lisp @ 7904

Last change on this file since 7904 was 7904, checked in by rme, 13 years ago

Uh, at least try compiling the file before committing next time...

File size: 6.3 KB
Line 
1(in-package "CCL")
2
3;;; %BIGNUM-REF needs to access bignums as obviously as possible, and it needs
4;;; to be able to return 32 bits somewhere no one looks for real objects.
5;;;
6;;; The easiest thing to do is to store the 32 raw bits in two fixnums
7;;; and return multiple values.
8(defx8632lapfunction %bignum-ref ((bignum arg_y) (i arg_z))
9  (movzwl (@ x8632::misc-data-offset (% bignum) (% i)) (% imm0))
10  (box-fixnum imm0 temp1)               ;low
11  (movzwl (@ (+ 2 x8632::misc-data-offset) (% bignum) (% i)) (% imm0))
12  (box-fixnum imm0 temp0)               ;high
13  (push (% temp0))
14  (push (% temp1))
15  (set-nargs 2)
16  (jmp-subprim .SPvalues))
17
18;;; Set the 0th element of DEST (a bignum or some other 32-bit ivector)
19;;; to the Ith element of the bignum SRC.
20(defx8632lapfunction %ref-digit ((bignum 4) #|(ra 0)|# (i arg_y) (dest arg_z))
21  (movl (@ bignum (% esp)) (% temp0))
22  (movl (@ x8632::misc-data-offset (% temp0) (% i)) (% imm0))
23  (svset dest 0 imm0)
24  (single-value-return 3))
25
26;;; BIGNUM[I] := DIGIT[0]
27(defx8632lapfunction %set-digit ((bignum 4) #|(ra 0)|# (i arg_y) (digit arg_z))
28  (movl (@ bignum (% esp)) (% temp0))
29  (svref digit 0 imm0)
30  (movl (% imm0) (@ x8632::misc-data-offset (% temp0) (% i)))
31  (single-value-return 3))
32
33;;; Return 0 if the 0th digit in X is 0.
34(defx8632lapfunction %digit-zerop ((x arg_z))
35  (svref x 0 imm0)
36  (movl ($ x8632::nil-value) (% arg_z))
37  (testl (% imm0) (% imm0))
38  (cmovel (% imm0) (% arg_z))
39  (single-value-return))
40
41;;; store the sign of bignum (0 or -1) in the one-word bignum "digit".
42(defx8632lapfunction %bignum-sign-digit ((bignum arg_y) (digit arg_z))
43  (vector-length bignum imm0)
44  (movl (@ (- 4 x8632::misc-data-offset) (% bignum) (% imm0)) (% imm0))
45  (shr ($ 31) (% imm0))                        ;propagate sign bit
46  (svset digit 0 imm0)
47  (single-value-return))
48
49;;; Return the sign of bignum (0 or -1) as a fixnum
50(defx8632lapfunction %bignum-sign ((bignum arg_z))
51  (vector-length bignum imm0)
52  (movl (@ (- 4 x8632::misc-data-offset) (% bignum) (% imm0)) (% imm0))
53  (shr ($ 31) (% imm0))                        ;propagate sign bit
54  (box-fixnum imm0 arg_z)
55  (single-value-return))
56
57;;; Count the sign bits in the most significant digit of bignum;
58;;; return fixnum count.
59(defx8632lapfunction %bignum-sign-bits ((bignum arg_z))
60  (vector-size bignum imm0 imm0)
61  (movl (@ (- x8632::misc-data-offset 4) (% bignum) (% imm0) 4) (% imm0))
62  (mark-as-imm temp0)
63  (movl (% imm0) (% temp0))
64  (notl (% imm0))
65  (testl (% temp0) (% temp0))
66  (js @wasneg)
67  (notl (% imm0))
68  @wasneg
69  (bsrl (% imm0) (% imm0))
70  (sete (% temp0.b))
71  (xorl ($ 31) (% imm0))
72  (addb (% temp0.b) (% imm0.b))
73  (box-fixnum imm0 arg_z)
74  (mark-as-node temp0)
75  (single-value-return))
76
77(defx8632lapfunction %digit-0-or-plusp ((bignum arg_y) (idx arg_z))
78  (testl (@ x8632::misc-data-offset (% bignum) (% idx)) (% imm0))
79  (movl ($ x8632::nil-value) (% temp0))
80  (cmovbl (% temp0) (% arg_z))
81  (single-value-return))
82
83;;; For oddp, evenp
84(defx8632lapfunction %bignum-oddp ((bignum arg_z))
85  (testb ($ 1) (@ x8632::misc-data-offset (% bignum)))
86  (movl ($ x8632::nil-value) (% temp0))
87  (cmovel (% temp0) (% arg_z))
88  (single-value-return))
89
90(defx8632lapfunction bignum-plusp ((bignum arg_z))
91  (vector-length bignum imm0)
92  (movl (@ (- 4 x8632::misc-data-offset) (% bignum)) (% imm0))
93  (testl ($ #x8000000) (% imm0))
94  (movl ($ x8632::nil-value) (% temp0))
95  (cmovnel (% temp0) (% arg_z))
96  (single-value-return))
97
98(defx8632lapfunction %fixnum-to-bignum-set ((bignum arg_y) (fixnum arg_z))
99  (unbox-fixnum fixnum imm0)
100  (movl (% imm0) (@ x8632::misc-data-offset (% bignum)))
101  (single-value-return))
102
103(defx8632lapfunction bignum-minusp ((bignum arg_z))
104  (vector-length bignum imm0)
105  (movl (@ (- 4 x8632::misc-data-offset) (% bignum) (% imm0)) (% imm0))
106  (testl ($ #x8000000) (% imm0))
107  (movl ($ x8632::nil-value) (% temp0))
108  (cmovel (% temp0) (% arg_z))
109  (single-value-return))
110
111;;; Add the digits A[I] and B[J], and the incoming carry C (a fixnum).
112;;; Store the result in R[K], and return the outgoing carry.
113;;; If I is NIL, A is a fixnum.  If J is NIL, B is a fixnum.
114(defx8632lapfunction %add-with-carry ((r 20) (k 16) (c 12) (a 8) (i 4) #|(ra 0)|# (b arg_y) (j arg_z))
115  (mark-as-imm temp0)
116  (unbox-fixnum b imm0)                 ;assume that j is going to be nil
117  (cmpl ($ x8632::nil-value) (% j))     ;is j in fact nil?
118  (jne @got-b)
119  (movl (@ x8632::misc-data-offset (% b) (% j)) (% imm0))
120  @got-b
121  (movl (@ a (% esp)) (% arg_y))
122  (unbox-fixnum arg_y temp0)            ;assume that i is going be nil
123  (movl (@ i (% esp)) (% arg_z))
124  (cmpl ($ x8632::nil-value) (% arg_z)) ;is i in fact nil?
125  (jne @got-a)
126  (movl (@ x8632::misc-data-offset (% arg_y) (% arg_z)) (% temp0))
127  @got-a
128  ;; unboxed a or a[i] now in temp0
129  ;; unboxed b or b[j] now in imm0
130  (xorl (% arg_z) (% arg_z))
131  (movl (@ c (% esp)) (% arg_y))
132  (testl (% arg_y) (% arg_y))           ;clears carry flag
133  (jz @add)
134  (stc)
135  @add
136  (adc (% temp0) (% imm0))
137  (movl (@ r (% esp)) (% temp0))
138  (movl (@ k (% esp)) (% temp1))
139  (movl (% imm0) (@ x8632::misc-data-offset (% temp0) (% temp1)))
140  (adc ($ 0) (% imm0))                  ;propagate carry flag
141  (box-fixnum imm0 arg_z)
142  (mark-as-node temp0)
143  (single-value-return 7))
144
145;;; Store the result of A[I] - B[J] - borrow into R[K], returning the borrow.
146;;; If I is NIL, A is a fixnum; likewise for J and B.
147(defx8632lapfunction %subtract-with-borrow ((r 20) (k 16) (borrow 12) (a 8) (i 4) #|(ra 0)|# (b arg_y) (j arg_z))
148  (mark-as-imm temp0)
149  (unbox-fixnum b imm0)                 ;assume that j is going to be nil
150  (cmpl ($ x8632::nil-value) (% j))     ;is j in fact nil?
151  (jne @got-b)
152  (movl (@ x8632::misc-data-offset (% b) (% j)) (% imm0))
153  @got-b
154  (movl (@ a (% esp)) (% arg_y))
155  (unbox-fixnum arg_y temp0)            ;assume that i is going be nil
156  (movl (@ i (% esp)) (% arg_z))
157  (cmpl ($ x8632::nil-value) (% arg_z)) ;is i in fact nil?
158  (jne @got-a)
159  (movl (@ x8632::misc-data-offset (% arg_y) (% arg_z)) (% temp0))
160  @got-a
161  ;; unboxed a or a[i] now in temp0
162  ;; unboxed b or b[j] now in imm0
163  (xorl (% arg_z) (% arg_z))
164  (movl (@ borrow (% esp)) (% arg_y))
165  (testl (% arg_y) (% arg_y))           ;clears carry flag
166  (jz @sub)
167  (stc)
168  @sub
169  (sbb (% imm0) (% temp0))
170  (movl (@ r (% esp)) (% temp0))
171  (movl (@ k (% esp)) (% temp1))
172  (movl (% imm0) (@ x8632::misc-data-offset (% temp0) (% temp1)))
173  (adc ($ 0) (% imm0))                  ;propagate carry flag
174  (box-fixnum imm0 arg_z)
175  (mark-as-node temp0)
176  (single-value-return 7))
Note: See TracBrowser for help on using the repository browser.