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

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

New file. Much remains to be done.

File size: 6.1 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  (xorl (% arg_z) (% arg_z))
37  (testl (% imm0) (% imm0))
38  (cmovnz ($ x8632::nil-value) (% 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  (xorl (% imm0) (% imm0))
79  (testl (@ x8632::misc-data-offset (% bignum) (% idx)) (% imm0))
80  (cmovbl ($ x8632::nil-value) (% 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  (cmovzl ($ x8632::nil-value) (% arg_z))
87  (single-value-return))
88
89(defx8632lapfunction bignum-plusp ((bignum arg_z))
90  (vector-length bignum imm0)
91  (movl (@ (- 4 x8632::misc-data-offset) (% bignum)) (% imm0))
92  (testl ($ #x8000000) (% imm0))
93  (cmovnzl ($ x8632::nil-value) (% arg_z))
94  (single-value-return))
95
96(defx8632lapfunction %fixnum-to-bignum-set ((bignum arg_y) (fixnum arg_z))
97  (unbox-fixnum fixnum imm0)
98  (movl (% imm0) (@ x8632::misc-data-offset (% bignum)))
99  (single-value-return))
100
101(defx8632lapfunction bignum-minusp ((bignum arg_z))
102  (vector-length bignum imm0)
103  (movl (@ (- 4 x8632::misc-data-offset) (% bignum) (% imm0)))
104  (testl ($ #x8000000) (% imm0))
105  (cmovzl ($ x8632::nil-value) (% arg_z))
106  (single-value-return))
107
108;;; Add the digits A[I] and B[J], and the incoming carry C (a fixnum).
109;;; Store the result in R[K], and return the outgoing carry.
110;;; If I is NIL, A is a fixnum.  If J is NIL, B is a fixnum.
111(defx8632lapfunction %add-with-carry ((r 20) (k 16) (c 12) (a 8) (i 4) #|(ra 0)|# (b arg_y) (j arg_z))
112  (mark-as-imm temp0)
113  (unbox-fixnum b imm0)                 ;assume that j is going to be nil
114  (cmpl ($ x8632::nil-value) (% j))     ;is j in fact nil?
115  (jne @got-b)
116  (movl (@ x8632::misc-data-offset (% b) (% j)) (% imm0))
117  @got-b
118  (movl (@ a (% esp)) (% arg_y))
119  (unbox-fixnum arg_y temp0)            ;assume that i is going be nil
120  (movl (@ i (% esp)) (% arg_z))
121  (cmpl ($ x8632::nil-value) (% arg_z)) ;is i in fact nil?
122  (jne @got-a)
123  (movl (@ x8632::misc-data-offset (% arg_y) (% arg_z)) (% temp0))
124  @got-a
125  ;; unboxed a or a[i] now in temp0
126  ;; unboxed b or b[j] now in imm0
127  (xorl (% arg_z) (% arg_z))
128  (movl (@ c (% esp)) (% arg_y))
129  (testl (% arg_y) (% arg_y))           ;clears carry flag
130  (jz @add)
131  (stc)
132  @add
133  (adc (% temp0) (% imm0))
134  (cmovcl ($ fixnumone) (% arg_z))
135  (movl (@ r (% esp)) (% temp0))
136  (movl (@ k (% esp)) (% temp1))
137  (movl (% imm0) (@ x8632::misc-data-offset (% temp0) (% temp1)))
138  (mark-as-node temp0)
139  (single-value-return 7))
140
141;;; Store the result of A[I] - B[J] - borrow into R[K], returning the borrow.
142;;; If I is NIL, A is a fixnum; likewise for J and B.
143(defx8632lapfunction %subtract-with-borrow ((r 20) (k 16) (borrow 12) (a 8) (i 4) #|(ra 0)|# (b arg_y) (j arg_z))
144  (mark-as-imm temp0)
145  (unbox-fixnum b imm0)                 ;assume that j is going to be nil
146  (cmpl ($ x8632::nil-value) (% j))     ;is j in fact nil?
147  (jne @got-b)
148  (movl (@ x8632::misc-data-offset (% b) (% j)) (% imm0))
149  @got-b
150  (movl (@ a (% esp)) (% arg_y))
151  (unbox-fixnum arg_y temp0)            ;assume that i is going be nil
152  (movl (@ i (% esp)) (% arg_z))
153  (cmpl ($ x8632::nil-value) (% arg_z)) ;is i in fact nil?
154  (jne @got-a)
155  (movl (@ x8632::misc-data-offset (% arg_y) (% arg_z)) (% temp0))
156  @got-a
157  ;; unboxed a or a[i] now in temp0
158  ;; unboxed b or b[j] now in imm0
159  (xorl (% arg_z) (% arg_z))
160  (movl (@ borrow (% esp)) (% arg_y))
161  (testl (% arg_y) (% arg_y))           ;clears carry flag
162  (jz @sub)
163  (stc)
164  @sub
165  (sbb (% imm0) (% temp0))
166  (cmovcl ($ fixnumone) (% arg_z))
167  (movl (@ r (% esp)) (% temp0))
168  (movl (@ k (% esp)) (% temp1))
169  (movl (% imm0) (@ x8632::misc-data-offset (% temp0) (% temp1)))
170  (mark-as-node temp0)
171  (single-value-return 7))
Note: See TracBrowser for help on using the repository browser.