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

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

Merge trunk changes r13066 through r13067.
(copyright notices)

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