source: release/1.11/source/level-0/X86/X8632/x8632-misc.lisp

Last change on this file was 16688, checked in by R. Matthew Emerson, 9 years ago

Merge copyright/license header changes to 1.11 release branch.

File size: 28.9 KB
RevLine 
[16688]1;;;
[13067]2;;; Copyright 2009 Clozure Associates
3;;;
[16688]4;;; Licensed under the Apache License, Version 2.0 (the "License");
5;;; you may not use this file except in compliance with the License.
6;;; You may obtain a copy of the License at
[13067]7;;;
[16688]8;;; http://www.apache.org/licenses/LICENSE-2.0
[13067]9;;;
[16688]10;;; Unless required by applicable law or agreed to in writing, software
11;;; distributed under the License is distributed on an "AS IS" BASIS,
12;;; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13;;; See the License for the specific language governing permissions and
14;;; limitations under the License.
[13067]15
[7997]16(in-package "CCL")
17
18;;; Copy N bytes from pointer src, starting at byte offset src-offset,
19;;; to ivector dest, starting at offset dest-offset.
20;;; It's fine to leave this in lap.
21;;; Depending on alignment, it might make sense to move more than
22;;; a byte at a time.
23;;; Does no arg checking of any kind. Really.
[15156]24(defun %copy-ptr-to-ivector (src src-byte-offset dest dest-byte-offset nbytes)
25 (declare (fixnum src-byte-offset dest-byte-offset nbytes)
26 (optimize (speed 3) (safety 0)))
27 (let* ((ptr-align (logand 7 (%ptr-to-int src))))
28 (declare (type (mod 8) ptr-align))
29 (if (and (= 0 (logand nbytes 3))
30 (= 0 (logand dest-byte-offset 3))
31 (= 0 (logand (the fixnum (+ ptr-align src-byte-offset)) 3)))
32 (%copy-ptr-to-ivector-32bit src src-byte-offset dest dest-byte-offset nbytes)
33 (%copy-ptr-to-ivector-8bit src src-byte-offset dest dest-byte-offset nbytes))
34 dest))
[7997]35
[15156]36;;; We can exploit the fact that SRC-BYTE-OFFSET and DEST-BYTE-OFFSET
37;;; are both multiples of 4 (and therefore still fixnums when unboxed).
38(defx8632lapfunction %copy-ptr-to-ivector-32bit ((psrc 12)
39 (psrc-byte-offset 8)
40 (pdest 4)
41 #|(ra 0)|#
42 (dest-byte-offset arg_y)
43 (nbytes arg_z))
44
45 (let ((foreign-ptr imm0) ;raw foreign pointer
46 (ivector temp1)) ;destination ivector
47 (movl (@ psrc (% esp)) (% temp1))
48 (movl (@ psrc-byte-offset (% esp)) (% foreign-ptr))
49 (sarl ($ x8632::word-shift)(% foreign-ptr))
50 (addl (@ x8632::macptr.address (% temp1)) (% foreign-ptr))
51 (movl (@ pdest (% esp)) (% ivector))
52 (sarl ($ x8632::word-shift) (% dest-byte-offset))
53 (jmp @test16)
54 @loop16
55 (movdqu (@ (% foreign-ptr)) (% xmm0))
56 (movdqu (% xmm0) (@ x8632::misc-data-offset (% ivector) (% dest-byte-offset)))
57 (addl ($ 16) (% foreign-ptr))
58 (addl ($ 16) (% dest-byte-offset))
59 (subl ($ '16) (% nbytes))
60 @test16
61 (cmpl ($ '16) (% nbytes))
62 (jge @loop16)
63 (testl (% nbytes) (% nbytes))
64 (je @done)
65 @loop4
66 (movd (@ (% foreign-ptr)) (% mm0))
67 (movd (% mm0) (@ x8632::misc-data-offset (% ivector) (% dest-byte-offset)))
68 (addl ($ 4) (% foreign-ptr))
69 (addl ($ 4) (% dest-byte-offset))
70 (subl ($ '4) (% nbytes))
71 (jne @loop4)
72 @done
73 (movl (% ivector) (% arg_z))
74 (single-value-return 5)))
75
[7997]76;;; I went ahead and used the INC and DEC instructions here, since
77;;; they're shorter than the equivalent ADD/SUB. Intel's optimization
78;;; manual advises avoiding INC and DEC because they might cause
79;;; dependencies on earlier instructions that set the flags. So, if
80;;; these functions end up being hot, replacing the inc/dec insns
81;;; might be worth a try.
82
[15156]83(defx8632lapfunction %copy-ptr-to-ivector-8bit ((src 12)
84 (src-byte-offset 8)
85 (dest 4)
86 #|(ra 0)|#
87 (dest-byte-offset arg_y)
88 (nbytes arg_z))
[7997]89 (mark-as-imm temp0)
90 (mark-as-imm arg_y)
91 (let ((foreign-ptr temp0) ;raw foreign pointer
92 (ivector temp1) ;destination ivector
93 (j arg_y)) ;unboxed index into ivector
94 (movl (@ src (% esp)) (% temp1))
95 (macptr-ptr temp1 foreign-ptr)
96 (movl (@ src-byte-offset (% esp)) (% temp1))
97 (unbox-fixnum temp1 imm0)
98 (addl (% imm0) (% foreign-ptr)) ;point to starting byte in src
99 (movl (@ dest (% esp)) (% ivector))
100 (sarl ($ x8632::fixnumshift) (% j)) ;unbox dest-byte-offset
101 (testl (% nbytes) (% nbytes))
102 (jmp @test)
103 @loop
104 (movb (@ (% foreign-ptr)) (%b imm0))
105 (incl (% foreign-ptr))
106 (movb (%b imm0) (@ x8632::misc-data-offset (% ivector) (% j)))
107 (incl (% j))
108 (subl ($ '1) (% nbytes))
109 @test
110 (jne @loop)
111 (movl (% ivector) (% arg_z)))
112 (mark-as-node temp0)
113 (mark-as-node arg_y)
114 (single-value-return 5))
115
116(defx8632lapfunction %copy-ivector-to-ptr ((src 12)
117 (src-byte-offset 8)
118 (dest 4)
119 #|(ra 0)|#
120 (dest-byte-offset arg_y)
121 (nbytes arg_z))
122 (mark-as-imm temp0)
123 (mark-as-imm arg_y)
124 (let ((foreign-ptr temp0) ;raw foreign pointer
125 (ivector temp1) ;source ivector
126 (j arg_y)) ;unboxed index into ivector
127 (movl (@ dest (% esp)) (% temp1))
128 (macptr-ptr temp1 foreign-ptr)
129 (unbox-fixnum dest-byte-offset imm0)
130 (addl (% imm0) (% foreign-ptr)) ;point to starting byte in dest
131 (movl (@ src (% esp)) (% ivector))
132 (movl (@ src-byte-offset (% esp)) (% j))
133 (sarl ($ x8632::fixnumshift) (% j)) ;unbox src-byte-offset
134 (test (% nbytes) (% nbytes))
135 (jmp @test)
136 @loop
137 (movb (@ x8632::misc-data-offset (% ivector) (% j)) (%b imm0))
138 (incl (% j))
139 (movb (%b imm0) (@ (% foreign-ptr)))
140 (incl (% foreign-ptr))
141 (subl ($ '1) (% nbytes))
142 @test
143 (jne @loop)
144 (movl (@ dest (% esp)) (% arg_z)))
145 (mark-as-node temp0)
146 (mark-as-node arg_y)
147 (single-value-return 5))
148
149(defx8632lapfunction %copy-ivector-to-ivector ((src 12)
150 (src-byte-offset 8)
151 (dest 4)
152 #|(ra 0)|#
153 (dest-byte-offset arg_y)
154 (nbytes arg_z))
155 (movl (@ src (% esp)) (% temp0))
156 (movl (@ src-byte-offset (% esp)) (% temp1))
157 (unbox-fixnum nbytes imm0) ;will be used below
158 (push (% nbytes)) ;put loop counter on stack
[8906]159 (movl (@ (+ 4 dest) (% esp)) (% arg_z))
[7997]160 (mark-as-imm temp1)
161 (mark-as-imm arg_y)
162 (sarl ($ x8632::fixnumshift) (% temp1)) ;unboxed src index
163 (sarl ($ x8632::fixnumshift) (% arg_y)) ;unboxed dest index
164 (let ((a temp0)
165 (i temp1)
166 (b arg_z)
167 (j arg_y))
168 ;; copy nbytes starting at a[i] to b[j]
169 (cmpl (% b) (% a))
170 (jne @front)
171 (cmpl (% i) (% j))
172 (jg @back)
173 @front
174 (testl (% imm0) (% imm0)) ;test nbytes
175 (jmp @front-test)
176 @front-loop
177 (movb (@ x8632::misc-data-offset (% a) (% i)) (%b imm0))
178 (movb (%b imm0) (@ x8632::misc-data-offset (% b) (% j)))
179 (incl (% i))
180 (incl (% j))
181 (subl ($ '1) (@ (% esp)))
182 @front-test
183 (jne @front-loop)
184 (jmp @done)
185 @back
186 ;; unboxed nbytes in imm0
187 (addl (% imm0) (% i))
188 (addl (% imm0) (% j))
189 (testl (% imm0) (% imm0))
190 (jmp @back-test)
191 @back-loop
192 (decl (% i))
193 (decl (% j))
194 (movb (@ x8632::misc-data-offset (% a) (% i)) (%b imm0))
195 (movb (%b imm0) (@ x8632::misc-data-offset (% b) (% j)))
196 (subl ($ '1) (@ (% esp)))
197 @back-test
198 (jne @back-loop)
199 @done
200 ;; dest already in arg_z
201 (addl ($ 4) (% esp)) ;pop nbytes
[8006]202 (mark-as-node temp1)
203 (mark-as-node arg_y)
[7997]204 (single-value-return 5)))
205
206(defx8632lapfunction %copy-gvector-to-gvector ((src 12)
207 (src-element 8)
208 (dest 4)
209 #|(ra 0)|#
210 (dest-element arg_y)
211 (nelements arg_z))
212 (let ((a temp0)
213 (i imm0)
214 (b arg_z)
215 (j arg_y)
216 (val temp1))
217 (movl (% nelements) (% val)) ;will be used below
218 (push (% nelements)) ;loop counter on stack (use ebp?)
[8906]219 (movl (@ (+ 4 src) (% esp)) (% a))
220 (movl (@ (+ 4 src-element) (% esp)) (% i))
221 (movl (@ (+ 4 dest) (% esp)) (% b))
[7997]222 ;; j/arg_y already set
223 (cmpl (% a) (% b))
224 (jne @front)
225 (rcmp (% i) (% j))
226 (jl @back)
227 @front
228 (testl (% val) (% val)) ;test nelements
229 (jmp @front-test)
230 @front-loop
231 (movl (@ x8632::misc-data-offset (% a) (% i)) (% val))
232 (movl (% val) (@ x8632::misc-data-offset (% b) (% j)))
233 (addl ($ '1) (% i))
234 (addl ($ '1) (% j))
235 (subl ($ '1) (@ (% esp)))
236 @front-test
237 (jne @front-loop)
238 (jmp @done)
239 @back
240 ;; nelements in val (from above)
241 (addl (% val) (% i))
242 (addl (% val) (% j))
243 (testl (% val) (% val))
244 (jmp @back-test)
245 @back-loop
246 (subl ($ '1) (% i))
247 (subl ($ '1) (% j))
248 (movl (@ x8632::misc-data-offset (% a) (% i)) (% val))
249 (movl (% val) (@ x8632::misc-data-offset (% b) (% j)))
250 (subl ($ '1) (@ (% esp)))
251 @back-test
252 (jne @back-loop)
253 @done
254 ;; dest already in arg_z
255 (addl ($ 4) (% esp)) ;pop loop counter
256 (single-value-return 5)))
257
258(defx8632lapfunction %heap-bytes-allocated ()
259 (movl (@ (% :rcontext) x8632::tcr.save-allocptr) (% temp1))
260 (movl (@ (% :rcontext) x8632::tcr.last-allocptr) (% temp0))
261 (cmpl ($ -8) (% temp1)) ;void_allocptr
[14619]262 (jz @go)
263 #+windows-target
264 (progn
265 (movl (:rcontext x8632::tcr.aux) (% imm0))
266 (movq (@ x8632::tcr-aux.total-bytes-allocated-low (% imm0)) (% mm0)))
267 #-windows-target
[7997]268 (movq (@ (% :rcontext) x8632::tcr.total-bytes-allocated-low) (% mm0))
269 (movl (% temp0) (% arg_y))
270 (subl (% temp1) (% temp0))
271 (testl (% arg_y) (% arg_y))
272 (jz @go)
273 (movd (% temp0) (% mm1))
274 (paddq (% mm1) (% mm0))
275 @go
276 (jmp-subprim .SPmakeu64))
277
278(defx8632lapfunction values ()
279 (:arglist (&rest values))
280 (save-frame-variable-arg-count)
281 (push-argregs)
282 (jmp-subprim .SPnvalret))
283
284(defx8632lapfunction rdtsc ()
285 (mark-as-imm temp1) ;aka edx
286 (:byte #x0f) ;two-byte rdtsc opcode
287 (:byte #x31) ;is #x0f #x31
288 (box-fixnum imm0 arg_z)
289 (mark-as-node temp1)
290 (single-value-return))
291
292;;; Return all 64 bits of the time-stamp counter as an unsigned integer.
293(defx8632lapfunction rdtsc64 ()
294 (mark-as-imm temp1) ;aka edx
295 (:byte #x0f) ;two-byte rdtsc opcode
296 (:byte #x31) ;is #x0f #x31
297 (movd (% eax) (% mm0))
298 (movd (% edx) (% mm1))
299 (psllq ($ 32) (% mm1))
300 (por (% mm1) (% mm0))
301 (mark-as-node temp1)
302 (jmp-subprim .SPmakeu64))
303
304;;; It would be nice if (%setf-macptr macptr (ash (the fixnum value)
305;;; ash::fixnumshift)) would do this inline.
306
307(defx8632lapfunction %setf-macptr-to-object ((macptr arg_y) (object arg_z))
308 (check-nargs 2)
309 (trap-unless-typecode= macptr x8632::subtag-macptr)
310 (movl (% object) (@ x8632::macptr.address (% macptr)))
311 (single-value-return))
312
313(defx8632lapfunction %fixnum-from-macptr ((macptr arg_z))
314 (check-nargs 1)
315 (trap-unless-typecode= arg_z x8632::subtag-macptr)
316 (movl (@ x8632::macptr.address (% arg_z)) (% imm0))
317 (mark-as-imm temp0)
318 (let ((imm1 temp0))
319 (trap-unless-lisptag= imm0 x8632::tag-fixnum imm1))
320 (mark-as-node temp0)
321 (movl (% imm0) (% arg_z))
322 (single-value-return))
323
324(defx8632lapfunction %%get-unsigned-longlong ((ptr arg_y) (offset arg_z))
325 (trap-unless-typecode= ptr x8632::subtag-macptr)
326 (mark-as-imm temp0)
327 (let ((imm1 temp0))
328 (macptr-ptr ptr imm1)
329 (unbox-fixnum offset imm0)
330 (movq (@ (% imm1) (% imm0)) (% mm0)))
331 (mark-as-node temp0)
332 (jmp-subprim .SPmakeu64))
333
334(defx8632lapfunction %%get-signed-longlong ((ptr arg_y) (offset arg_z))
335 (trap-unless-typecode= ptr x8632::subtag-macptr)
336 (mark-as-imm temp0)
337 (let ((imm1 temp0))
338 (macptr-ptr ptr imm1)
339 (unbox-fixnum offset imm0)
340 (movq (@ (% imm1) (% imm0)) (% mm0)))
341 (mark-as-node temp0)
342 (jmp-subprim .SPmakes64))
343
344(defx8632lapfunction %%set-unsigned-longlong ((ptr 4)
345 #|(ra 0)|#
346 (offset arg_y)
347 (val arg_z))
348 (let ((rptr temp0)
[11057]349 (imm1 temp1)
350 (ptr-in-frame -4))
351 (save-stackargs-frame 1)
352 (movl (@ ptr-in-frame (% ebp)) (% rptr))
[7997]353 (trap-unless-typecode= rptr x8632::subtag-macptr)
354 (call-subprim .SPgetu64)
355 (macptr-ptr rptr imm0)
[11057]356 (mark-as-imm temp1)
[7997]357 (unbox-fixnum offset imm1)
358 (movq (% mm0) (@ (% imm0) (% imm1)))
[11057]359 (mark-as-node temp1)
360 (restore-simple-frame)
361 (single-value-return)))
[7997]362
363(defx8632lapfunction %%set-signed-longlong ((ptr 4)
364 #|(ra 0)|#
365 (offset arg_y)
366 (val arg_z))
367 (let ((rptr temp0)
[11057]368 (imm1 temp1)
369 (ptr-in-frame -4))
370 (save-stackargs-frame 1)
371 (movl (@ ptr-in-frame (% ebp)) (% rptr))
[7997]372 (trap-unless-typecode= rptr x8632::subtag-macptr)
373 (call-subprim .SPgets64)
374 (macptr-ptr rptr imm0)
[11057]375 (mark-as-imm temp1)
[7997]376 (unbox-fixnum offset imm1)
377 (movq (% mm0) (@ (% imm0) (% imm1)))
[11057]378 (mark-as-node temp1)
379 (restore-simple-frame)
380 (single-value-return)))
[7997]381
382(defx8632lapfunction interrupt-level ()
383 (movl (@ (% :rcontext) x8632::tcr.tlb-pointer) (% imm0))
384 (movl (@ x8632::interrupt-level-binding-index (% imm0)) (% arg_z))
385 (single-value-return))
386
387(defx8632lapfunction set-interrupt-level ((new arg_z))
388 (movl (@ (% :rcontext) x8632::tcr.tlb-pointer) (% imm0))
389 (trap-unless-fixnum new)
390 (movl (% new) (@ x8632::interrupt-level-binding-index (% imm0)))
391 (single-value-return))
392
393(defx8632lapfunction %current-tcr ()
394 (movl (@ (% :rcontext) x8632::tcr.linear) (% arg_z))
395 (single-value-return))
396
397(defx8632lapfunction %tcr-toplevel-function ((tcr arg_z))
398 (check-nargs 1)
[14619]399 (movl (@ (- x8632::tcr.vs-area x8632::tcr-bias) (% tcr)) (% temp0))
[8216]400 (movl (@ x8632::area.high (% temp0)) (% imm0)) ;bottom of vstack
401 (cmpl (% tcr) (@ (% :rcontext) x8632::tcr.linear))
402 (jz @myself)
403 (cmpl (% imm0) (@ x8632::area.active (% temp0)))
404 (jmp @finish)
405 @myself
406 (cmpl (% imm0) (% esp))
407 @finish
[10959]408 (movl ($ (target-nil-value)) (% arg_z))
[8216]409 (cmovnel (@ (- x8632::node-size) (% imm0)) (% arg_z))
[7997]410 (single-value-return))
[8216]411
[7997]412(defx8632lapfunction %set-tcr-toplevel-function ((tcr arg_y) (fun arg_z))
413 (check-nargs 2)
[14619]414 (movl (@ (- x8632::tcr.vs-area x8632::tcr-bias) (% tcr)) (% temp0))
[8216]415 (movl (@ x8632::area.high (% temp0)) (% imm0))
416 (cmpl (% tcr) (@ (% :rcontext) x8632::tcr.linear))
417 (jz @myself)
418 (cmpl (% imm0) (@ x8632::area.active (% temp0))) ;vstack empty?
419 (jmp @room)
420 @myself
421 (cmpl (% imm0) (% esp))
422 @room
423 (leal (@ (- x8632::node-size) (% imm0)) (% imm0))
424 (movl ($ 0) (@ (% imm0)))
425 (jne @have-room)
426 (movl (% imm0) (@ x8632::area.active (% temp0)))
[14619]427 (movl (% imm0) (@ (- x8632::tcr.save-vsp x8632::tcr-bias) (% tcr)))
[8216]428 (jmp @have-room)
429 @have-room
430 (movl (% fun) (@ (% imm0)))
[7997]431 (single-value-return))
432
433;;; This needs to be done out-of-line, to handle EGC memoization.
434(defx8632lapfunction %store-node-conditional ((offset 8)
435 (object 4)
436 #|(ra 0)|#
437 (old arg_y)
438 (new arg_z))
439 (movl (@ offset (% esp)) (% temp0))
440 (movl (@ object (% esp)) (% temp1))
441 (save-simple-frame)
442 (call-subprim .SPstore-node-conditional)
443 (restore-simple-frame)
[8690]444 (single-value-return 4))
[7997]445
446(defx8632lapfunction %store-immediate-conditional ((offset 8)
447 (object 4)
448 #|(ra 0)|#
449 (old arg_y)
450 (new arg_z))
451 (mark-as-imm temp0)
452 (let ((imm1 temp0)
453 (robject temp1))
454 (movl (@ offset (% esp)) (% imm1))
455 (sarl ($ x8632::fixnumshift) (% imm1))
456 (movl (@ object (% esp)) (% robject))
[15500]457 (movl (% old) (% eax))
[7997]458 (lock)
459 (cmpxchgl (% new) (@ (% robject) (% imm1)))
[15500]460 (jne @lose)
[10959]461 (movl ($ (target-t-value)) (% arg_z))
[7997]462 (mark-as-node temp0)
463 (single-value-return 4)
464 @lose
[10959]465 (movl ($ (target-nil-value)) (% arg_z))
[7997]466 (mark-as-node temp0)
467 (single-value-return 4)))
468
469(defx8632lapfunction set-%gcable-macptrs% ((ptr arg_z))
[15500]470 (mark-as-node eax)
[7997]471 @again
[10959]472 (movl (@ (+ (target-nil-value) (x8632::kernel-global gcable-pointers))) (% eax))
[7997]473 (movl (% eax) (@ x8632::xmacptr.link (% ptr)))
474 (lock)
[10959]475 (cmpxchgl (% ptr) (@ (+ (target-nil-value) (x8632::kernel-global gcable-pointers))))
[15500]476 (je @win)
477 (pause)
478 (jmp @again)
479 @win
480 (mark-as-imm eax)
[7997]481 (single-value-return))
482
483;;; Atomically increment or decrement the gc-inhibit-count kernel-global
484;;; (It's decremented if it's currently negative, incremented otherwise.)
485(defx8632lapfunction %lock-gc-lock ()
486 @again
[10959]487 (movl (@ (+ (target-nil-value) (x8632::kernel-global gc-inhibit-count))) (% eax))
[7997]488 (lea (@ '-1 (% eax)) (% temp0))
489 (lea (@ '1 (% eax)) (% arg_z))
490 (test (% eax) (% eax))
491 (cmovsl (% temp0) (% arg_z))
492 (lock)
[10959]493 (cmpxchgl (% arg_z) (@ (+ (target-nil-value) (x8632::kernel-global gc-inhibit-count))))
[15500]494 (je @win)
495 (pause)
496 (jmp @again)
497@win
[7997]498 (single-value-return))
499
500;;; Atomically decrement or increment the gc-inhibit-count kernel-global
501;;; (It's incremented if it's currently negative, incremented otherwise.)
502;;; If it's incremented from -1 to 0, try to GC (maybe just a little.)
503(defx8632lapfunction %unlock-gc-lock ()
504 @again
[10959]505 (movl (@ (+ (target-nil-value) (x8632::kernel-global gc-inhibit-count)))
[7997]506 (% eax))
507 (lea (@ '1 (% eax)) (% temp0))
508 (cmpl ($ -1) (% eax))
509 (lea (@ '-1 (% eax)) (% arg_z))
510 (cmovlel (% temp0) (% arg_z))
511 (lock)
[10959]512 (cmpxchgl (% arg_z) (@ (+ (target-nil-value) (x8632::kernel-global gc-inhibit-count))))
[7997]513 (jne @again)
514 (cmpl ($ '-1) (% eax))
515 (jne @done)
516 ;; The GC tried to run while it was inhibited. Unless something else
517 ;; has just inhibited it, it should be possible to GC now.
518 (mov ($ arch::gc-trap-function-immediate-gc) (% imm0))
519 (uuo-gc-trap)
520 @done
521 (single-value-return))
522
523(defx8632lapfunction %atomic-incf-node ((by 4) #|(ra 0)|# (node arg_y) (disp arg_z))
524 (check-nargs 3)
525 (mark-as-imm temp0)
526 (let ((imm1 temp0)
527 (rby temp1))
528 (movl (@ by (% esp)) (% rby))
529 (unbox-fixnum disp imm1)
530 @again
531 (movl (@ (% node) (% imm1)) (% eax))
532 (lea (@ (% eax) (% rby)) (% arg_z))
533 (lock)
534 (cmpxchgl (% arg_z) (@ (% node) (% imm1)))
[15500]535 (je @win)
536 (pause)
537 (jmp @again)
538 @win)
[7997]539 (mark-as-node temp0)
[8690]540 (single-value-return 3))
[7997]541
542(defx8632lapfunction %atomic-incf-ptr ((ptr arg_z))
543 (mark-as-imm temp0)
544 (mark-as-imm temp1)
545 (let ((imm1 temp0)
546 (imm2 temp1))
547 (macptr-ptr ptr imm2)
548 @again
549 (movl (@ (% imm2)) (% eax))
550 (lea (@ 1 (% eax)) (% imm1))
551 (lock)
552 (cmpxchgl (% imm1) (@ (% imm2)))
[15500]553 (je @win)
554 (pause)
555 (jmp @again)
556 @win
[7997]557 (box-fixnum imm1 arg_z))
558 (mark-as-node temp0)
559 (mark-as-node temp1)
560 (single-value-return))
561
562(defx8632lapfunction %atomic-incf-ptr-by ((ptr arg_y) (by arg_z))
563 (mark-as-imm temp0)
564 (mark-as-imm temp1)
565 (let ((imm1 temp0)
566 (imm2 temp1))
567 (macptr-ptr ptr imm2)
568 @again
569 (movl (@ (% imm2)) (% eax))
570 (unbox-fixnum by imm1)
571 (add (% eax) (% imm1))
572 (lock)
573 (cmpxchgl (% imm1) (@ (% imm2)))
[15500]574 (je @win)
575 (pause)
576 (jmp @again)
577 @win
[7997]578 (box-fixnum imm1 arg_z))
579 (mark-as-node temp0)
580 (mark-as-node temp1)
581 (single-value-return))
582
583(defx8632lapfunction %atomic-decf-ptr ((ptr arg_z))
584 (mark-as-imm temp0)
585 (mark-as-imm temp1)
586 (let ((imm1 temp0)
587 (imm2 temp1))
588 (macptr-ptr ptr imm2)
589 @again
590 (movl (@ (% imm2)) (% eax))
591 (lea (@ -1 (% eax)) (% imm1))
592 (lock)
593 (cmpxchgl (% imm1) (@ (% imm2)))
[15500]594 (je @win)
595 (pause)
596 (jmp @again)
597 @win
[7997]598 (box-fixnum imm1 arg_z))
599 (mark-as-node temp0)
600 (mark-as-node temp1)
601 (single-value-return))
602
603(defx8632lapfunction %atomic-decf-ptr-if-positive ((ptr arg_z))
604 (mark-as-imm temp0)
605 (mark-as-imm temp1)
606 (let ((imm1 temp0)
607 (imm2 temp1))
608 (macptr-ptr ptr imm2)
609 @again
610 (movl (@ (% imm2)) (% eax))
611 (testl (% eax) (% eax))
612 (lea (@ -1 (% eax)) (% imm1))
613 (jz @done)
614 (lock)
615 (cmpxchgl (% imm1) (@ (% imm2)))
[15500]616 (jz @done)
617 (pause)
618 (jmp @again)
[7997]619 @done
620 (box-fixnum imm1 arg_z))
621 (mark-as-node temp0)
622 (mark-as-node temp1)
623 (single-value-return))
624
625(defx8632lapfunction %atomic-swap-ptr ((ptr arg_y) (newval arg_z))
626 (mark-as-imm temp0)
627 (let ((imm1 temp0))
628 (macptr-ptr arg_y imm1)
629 (unbox-fixnum newval imm0)
630 (lock)
631 (xchgl (% imm0) (@ (% imm1)))
632 (box-fixnum imm0 arg_z))
633 (mark-as-node temp0)
634 (single-value-return))
635
636;;; Try to store the fixnum NEWVAL at PTR, if and only if the old value
637;;; was equal to OLDVAL. Return the old value
638(defx8632lapfunction %ptr-store-conditional ((ptr 4) #|(ra 0)|# (expected-oldval arg_y) (newval arg_z))
639 (mark-as-imm temp1)
640 (let ((imm2 temp1))
641 (movl (@ ptr (% esp)) (% temp0))
642 (macptr-ptr temp0 imm2)
643 (mark-as-imm temp0)
644 (let ((imm1 temp0))
[15500]645 (unbox-fixnum expected-oldval imm0)
[7997]646 (unbox-fixnum newval imm1)
647 (lock)
648 (cmpxchgl (% imm1) (@ (% imm2)))
[15500]649 (jne @lost)
650 (movl (% expected-oldval) (% arg_z))
651 (jmp @done)
652 @lost
653 (box-fixnum imm0 arg_z)
654 @done)
[7997]655 (mark-as-node temp0))
656 (mark-as-node temp1)
[8690]657 (single-value-return 3))
[7997]658
[10266]659(defx8632lapfunction %ptr-store-fixnum-conditional ((ptr 4) #|(ra 0)|# (expected-oldval arg_y) (newval arg_z))
[7997]660 (mark-as-imm temp0)
661 (let ((address temp0))
[8690]662 (movl (@ ptr (% esp)) (% temp1))
663 (macptr-ptr temp1 address)
[15500]664 (movl (% expected-oldval) (% imm0))
[7997]665 (lock)
666 (cmpxchgl (% newval) (@ (% address)))
[15500]667 (cmovel (% expected-oldval) (% arg_z))
668 (cmovnel (% imm0) (% arg_z)))
[7997]669 (mark-as-node temp0)
[8690]670 (single-value-return 3))
[7997]671
[10266]672(defx8632lapfunction xchgl ((newval arg_y) (ptr arg_z))
673 (unbox-fixnum newval imm0)
674 (macptr-ptr ptr arg_y) ;better be aligned
675 (xchgl (% imm0) (@ (% arg_y)))
676 (box-fixnum imm0 arg_z)
677 (single-value-return))
678
[7997]679(defx8632lapfunction %macptr->dead-macptr ((macptr arg_z))
680 (check-nargs 1)
681 (movb ($ x8632::subtag-dead-macptr) (@ x8632::misc-subtag-offset (% macptr)))
682 (single-value-return))
683
684;;; %%apply-in-frame
685
686(defx8632lapfunction %%save-application ((flags arg_y) (fd arg_z))
[9475]687 (unbox-fixnum fd imm0)
688 (movd (% imm0) (% mm0))
[7997]689 (unbox-fixnum flags imm0)
690 (orl ($ arch::gc-trap-function-save-application) (% imm0))
691 (uuo-gc-trap)
692 (single-value-return))
693
694(defx8632lapfunction %misc-address-fixnum ((misc-object arg_z))
695 (check-nargs 1)
696 (lea (@ x8632::misc-data-offset (% misc-object)) (% arg_z))
697 (single-value-return))
698
699(defx8632lapfunction fudge-heap-pointer ((ptr 4) #|(ra 0)|# (subtype arg_y) (len arg_z))
700 (check-nargs 3)
701 (mark-as-imm temp0)
702 (let ((imm1 temp0))
703 (movl (@ ptr (% esp)) (% temp1))
704 (macptr-ptr temp1 imm1) ; address in macptr
705 (lea (@ 9 (% imm1)) (% imm0)) ; 2 for delta + 7 for alignment
706 (andb ($ -8) (%b imm0)) ; Clear low three bits to align
707 (subl (% imm0) (% imm1)) ; imm1 = -delta
708 (negw (%w imm1))
709 (movw (%w imm1) (@ -2 (% imm0))) ; save delta halfword
710 (unbox-fixnum subtype imm1) ; subtype at low end of imm1
711 (shll ($ (- x8632::num-subtag-bits x8632::fixnum-shift)) (% len))
712 (orl (% len) (% imm1))
713 (movl (% imm1) (@ (% imm0))) ; store subtype & length
714 (lea (@ x8632::fulltag-misc (% imm0)) (% arg_z))) ; tag it, return it
715 (mark-as-node temp0)
[8690]716 (single-value-return 3))
[7997]717
718(defx8632lapfunction %%make-disposable ((ptr arg_y) (vector arg_z))
719 (check-nargs 2)
720 (mark-as-imm temp0)
721 (let ((imm1 temp0))
722 (lea (@ (- x8632::fulltag-misc) (% vector)) (% imm0)) ; imm0 is addr = vect less tag
723 (movzwl (@ -2 (% imm0)) (% imm1)) ; get delta
724 (subl (% imm1) (% imm0)) ; vector addr (less tag) - delta is orig addr
725 (movl (% imm0) (@ x8632::macptr.address (% ptr))))
726 (mark-as-node temp0)
727 (single-value-return))
728
729(defx8632lapfunction %vect-data-to-macptr ((vect arg_y) (ptr arg_z))
[15226]730 (cmpb ($ x8632::subtag-double-float-vector) (@ x8632::misc-subtag-offset (% vect)))
731 (je @dfloat)
732 (cmpb ($ x8632::subtag-double-float) (@ x8632::misc-subtag-offset (% vect)))
733 (je @dfloat)
[7997]734 (lea (@ x8632::misc-data-offset (% vect)) (% imm0))
[15226]735 (jmp @common)
736 @dfloat
737 (lea (@ x8632::misc-dfloat-offset (% vect)) (% imm0))
738 @common
[7997]739 (movl (% imm0) (@ x8632::macptr.address (% ptr)))
740 (single-value-return))
[9270]741
[14710]742(defx8632lapfunction %ivector-from-macptr ((ptr arg_z))
743 (macptr-ptr ptr imm0)
744 (mark-as-imm temp0)
745 (let ((imm1 temp0))
746 (movl (% imm0) (% imm1))
747 (andl ($ target::node-size) (% imm1))
748 (xorl ($ target::node-size) (% imm1))
749 (addl ($ (- target::fulltag-misc target::node-size)) (% imm0))
750 (subl (% imm1) (% imm0))
[14711]751 (mark-as-node temp0))
[14710]752 (movl (% imm0) (% arg_z))
753 (single-value-return))
754
[9270]755;;; Sadly, we have no NVRs on x8632.
756(defun get-saved-register-values ()
757 (values))
[9300]758
759(defx8632lapfunction %current-db-link ()
760 (movl (@ (% :rcontext) x8632::tcr.db-link) (% arg_z))
761 (single-value-return))
762
763(defx8632lapfunction %no-thread-local-binding-marker ()
764 (movl ($ x8632::subtag-no-thread-local-binding) (% arg_z))
765 (single-value-return))
[9475]766
[11450]767(defx8632lapfunction pending-user-interrupt ()
[9475]768 (xorl (% temp0) (% temp0))
[11450]769 (ref-global x8632::intflag arg_z)
770 ;; If another signal happens now, it will get ignored, same as if it happened
771 ;; before whatever signal is in arg_z. But then these are async signals, so
772 ;; who can be sure it didn't actually happen just before...
[9475]773 (set-global temp0 x8632::intflag)
774 (single-value-return))
[10266]775
776(defx8632lapfunction debug-trap-with-string ((arg arg_z))
777 (check-nargs 1)
778 (uuo-error-debug-trap-with-string)
779 (single-value-return))
780
[10449]781(defx8632lapfunction %safe-get-ptr ((src arg_y) (dest arg_z))
782 (check-nargs 2)
783 (save-simple-frame)
784 (macptr-ptr src imm0)
785 (leal (@ (:^ done) (% fn)) (% ra0))
786 (movl (% imm0) (@ (% :rcontext) x8632::tcr.safe-ref-address))
787 (movl (@ (% imm0)) (% imm0))
788 (jmp done)
789 (:tra done)
790 (recover-fn)
791 (movl ($ 0) (@ (% :rcontext) x8632::tcr.safe-ref-address))
792 (movl (% imm0) (@ x8632::macptr.address (% dest)))
793 (restore-simple-frame)
794 (single-value-return))
795
[10266]796(defx8632lapfunction %%tcr-interrupt ((target arg_z))
797 (check-nargs 1)
798 (ud2a)
799 (:byte 4)
800 (box-fixnum imm0 arg_z)
801 (single-value-return))
802
803(defx8632lapfunction %suspend-tcr ((target arg_z))
804 (check-nargs 1)
805 (ud2a)
806 (:byte 5)
[10407]807 (movzbl (%b imm0) (%l imm0))
[10266]808 (testl (%l imm0) (%l imm0))
[10959]809 (movl ($ (target-nil-value)) (%l arg_z))
[10407]810 (cmovnel (@ (+ target::t-offset target::symbol.vcell) (% arg_z)) (%l arg_z))
[10266]811 (single-value-return))
812
813(defx8632lapfunction %suspend-other-threads ()
814 (check-nargs 0)
815 (ud2a)
816 (:byte 6)
[10959]817 (movl ($ (target-nil-value)) (%l arg_z))
[10266]818 (single-value-return))
819
820(defx8632lapfunction %resume-tcr ((target arg_z))
821 (check-nargs 1)
822 (ud2a)
823 (:byte 7)
[10407]824 (movzbl (%b imm0) (%l imm0))
[10266]825 (testl (%l imm0) (%l imm0))
[10959]826 (movl ($ (target-nil-value)) (%l arg_z))
[10407]827 (cmovnel (@ (+ target::t-offset target::symbol.vcell) (% arg_z)) (%l arg_z))
[10266]828 (single-value-return))
829
830(defx8632lapfunction %resume-other-threads ()
831 (check-nargs 0)
832 (ud2a)
833 (:byte 8)
[10959]834 (movl ($ (target-nil-value)) (%l arg_z))
[10266]835 (single-value-return))
836
[11150]837
838(defx8632lapfunction %kill-tcr ((target arg_z))
839 (check-nargs 1)
840 (ud2a)
841 (:byte 9)
842 (testb (%b imm0) (%b imm0))
843 (movl ($ (target-nil-value)) (%l arg_z))
844 (cmovnel (@ (+ target::t-offset target::symbol.vcell) (% arg_z)) (%l arg_z))
845 (single-value-return))
846
[10266]847(defx8632lapfunction %get-spin-lock ((p arg_z))
848 (check-nargs 1)
849 (save-simple-frame)
850 (push (% arg_z))
851 @again
852 (mark-as-imm temp1)
853 (movl (@ -4 (% ebp)) (% arg_z))
854 (macptr-ptr arg_z temp1)
855 (movl (@ '*spin-lock-tries* (% fn)) (% arg_y))
856 (movl (@ '*spin-lock-timeouts* (% fn)) (% arg_z))
857 (movl (@ target::symbol.vcell (% arg_y)) (% arg_y))
[10270]858 (movl (@ (% :rcontext) x8632::tcr.linear) (% temp0))
[10266]859 @try-swap
860 (xorl (% eax) (% eax))
861 (lock)
862 (cmpxchgl (% temp0) (@ (% temp1)))
863 (je @done)
864 @spin
865 (pause)
866 (cmpl ($ 0) (@ (% temp1)))
867 (je @try-swap)
868 (subl ($ '1) (% arg_y))
869 (jne @spin)
870 @wait
871 (addl ($ x8632::fixnumone) (@ x8632::symbol.vcell (% arg_z)))
872 (mark-as-node temp1)
873 (call-symbol yield 0)
874 (jmp @again)
875 @done
876 (mark-as-node temp1)
877 (movl (@ -4 (% ebp)) (% arg_z))
878 (restore-simple-frame)
879 (single-value-return))
880
[11422]881;; tbd
882(defx8632lapfunction %%apply-in-frame-proto ()
883 (hlt))
[10266]884
885
[11526]886
[13279]887
[16323]888
[10266]889(defx8632lapfunction %staticp ((x arg_z))
890 (check-nargs 1)
[13279]891 (ref-global static-cons-area temp0)
[10266]892 (movl (% x) (% imm0))
[13279]893 (movl ($ (target-nil-value)) (% arg_z))
[10266]894 (subl (@ target::area.low (% temp0)) (% imm0))
895 (shrl ($ target::dnode-shift) (% imm0))
[13279]896 (mark-as-imm temp1)
897 (movl (@ target::area.ndnodes (% temp0)) (% temp1))
898 (subl (% imm0) (% temp1))
899 (lea (@ 128 (% temp1)) (% temp1))
900 (leal (@ (% temp1) target::fixnumone) (% temp1))
901 (cmoval (% temp1) (% arg_z))
902 (mark-as-node temp1)
[10266]903 (single-value-return))
904
905(defx8632lapfunction %static-inverse-cons ((n arg_z))
906 (check-nargs 1)
[13352]907 (testl ($ target::tagmask) (% arg_z))
908 (jne @fail)
[13279]909 (subl ($ '128) (% arg_z))
910 (ref-global static-cons-area temp0)
[13352]911 (movl (@ target::area.ndnodes (% temp0)) (% imm0))
912 (box-fixnum imm0 arg_y)
913 (rcmpl (% arg_z) (% arg_y))
914 (ja @fail)
[13279]915 (movl (@ target::area.high (% temp0)) (% imm0))
916 (subl (% arg_z) (% imm0))
917 (subl (% arg_z) (% imm0))
918 (lea (@ x8632::fulltag-cons (% imm0)) (% arg_z))
[13365]919 (cmpl ($ x8632::subtag-unbound) (@ x8632::cons.car (% arg_z)))
[13352]920 (je @fail)
921 (single-value-return)
922 @fail
923 (movl ($ (target-nil-value)) (% arg_z))
[10266]924 (single-value-return))
[10559]925
926;;; Get the thread-specific value of %fs.
927(defx8632lapfunction %get-fs-register ()
928 (xorl (% imm0) (% imm0))
929 (:byte #x66) ;movw %fs,%ax
930 (:byte #x8c)
931 (:byte #xe0)
932 (box-fixnum imm0 arg_z)
933 (single-value-return))
934
[10575]935(defx8632lapfunction %get-gs-register ()
[10559]936 (xorl (% imm0) (% imm0))
937 (:byte #x66) ;movw %gs,%ax
938 (:byte #x8c)
939 (:byte #xe8)
940 (box-fixnum imm0 arg_z)
941 (single-value-return))
942
Note: See TracBrowser for help on using the repository browser.