source: branches/purify/source/level-0/X86/X8632/x8632-misc.lisp

Last change on this file was 13242, checked in by Gary Byers, 15 years ago

x8632 static-cons stuff.

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