source: branches/win64/level-0/X86/x86-symbol.lisp @ 8649

Last change on this file since 8649 was 8649, checked in by gb, 12 years ago

Use (:rcontext tcr-field) syntax to reference TCR fields.
Don't use SAVE3 (was used for debugging of heap-walking code; might
be used in %%APPLY-IN-FRAME-PROTO if caller sets it.)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 5.3 KB
Line 
1;;;-*- Mode: Lisp; Package: CCL -*-
2;;;
3;;;   Copyright (C) 1994-2001 Digitool, Inc
4;;;   This file is part of OpenMCL. 
5;;;
6;;;   OpenMCL is licensed under the terms of the Lisp Lesser GNU Public
7;;;   License , known as the LLGPL and distributed with OpenMCL as the
8;;;   file "LICENSE".  The LLGPL consists of a preamble and the LGPL,
9;;;   which is distributed with OpenMCL as the file "LGPL".  Where these
10;;;   conflict, the preamble takes precedence. 
11;;;
12;;;   OpenMCL is referenced in the preamble as the "LIBRARY."
13;;;
14;;;   The LLGPL is also available online at
15;;;   http://opensource.franz.com/preamble.html
16
17(in-package "CCL")
18
19(eval-when (:compile-toplevel :execute)
20  (require "X8664-ARCH")
21  (require "X86-LAPMACROS"))
22
23;;; This assumes that macros & special-operators
24;;; have something that's not FUNCTIONP in their
25;;; function-cells.  It also assumes that NIL
26;;; isn't a true symbol, but that NILSYM is.
27(defx86lapfunction %function ((sym arg_z))
28  (check-nargs 1)
29  (let ((symaddr temp0))
30    (movq ($ (+ x8664::nil-value x8664::nilsym-offset)) (% symaddr))
31    (cmp-reg-to-nil sym)
32    (cmovneq (% sym) (% symaddr))
33    (trap-unless-fulltag= symaddr x8664::fulltag-symbol)
34    (movq (% sym) (% arg_y))
35    (movq (@ x8664::symbol.fcell (% symaddr)) (% arg_z))
36    (extract-fulltag arg_z imm0)
37    (cmpb ($ x8664::fulltag-function) (%b imm0))
38    (je.pt @ok)
39    (uuo-error-udf (% arg_y))
40    @ok
41    (single-value-return)))
42
43;;; Traps unless sym is NIL or some other symbol.  If NIL, return
44;;; nilsym
45(defx86lapfunction %symbol->symptr ((sym arg_z))
46  (let ((tag imm0 ))
47    (movq ($ (+ x8664::nil-value x8664::nilsym-offset)) (% tag))
48    (cmp-reg-to-nil sym)
49    (cmoveq (% sym) (% tag))
50    (je :done)
51    (trap-unless-fulltag= sym x8664::fulltag-symbol)
52    :done
53    (single-value-return)))
54
55;;; If symptr is NILSYM, return NIL; else typecheck and return symptr
56(defx86lapfunction %symptr->symbol ((symptr arg_z))
57  (movw ($ (ash 1 x8664::fulltag-symbol)) (% imm0.w))
58  (btw (%w symptr) (% imm0.w))
59  (jb.pt @ok)
60  (uuo-error-reg-not-tag (% symptr) ($ x8664::fulltag-symbol))
61  @ok
62  (cmpq ($ (+ x8664::nil-value x8664::nilsym-offset)) (% symptr))
63  (sete (% imm0.b))
64  (negb (% imm0.b))
65  (andl ($ x8664::nilsym-offset) (% imm0.l))
66  (subq (% imm0) (% symptr))
67  (single-value-return))
68
69
70;;; Given something whose fulltag is FULLTAG-SYMBOL, return the
71;;; underlying uvector.  This function and its inverse would
72;;; be good candidates for inlining.
73(defx86lapfunction %symptr->symvector ((symptr arg_z))
74  (subb ($ (- x8664::fulltag-symbol x8664::fulltag-misc)) (% arg_z.b))
75  (single-value-return))
76
77(defx86lapfunction %symvector->symptr ((symbol-vector arg_z))
78  (addb ($ (- x8664::fulltag-symbol x8664::fulltag-misc)) (% arg_z.b))
79  (single-value-return))
80   
81(defx86lapfunction %symptr-value ((symptr arg_z))
82  (jmp-subprim .SPspecref))
83
84(defx86lapfunction %set-symptr-value ((symptr arg_y) (val arg_z))
85  (jmp-subprim .SPspecset))
86
87;;; This gets a tagged symbol as an argument.
88;;; If there's no thread-local binding, it should return
89;;; the underlying symbol vector as a first return value.
90(defx86lapfunction %symptr-binding-address ((symptr arg_z))
91  (movq (@ x8664::symbol.binding-index (% symptr)) (% arg_y))
92  (rcmp (% arg_y) (:rcontext x8664::tcr.tlb-limit))
93  (movq (:rcontext x8664::tcr.tlb-pointer) (% arg_x))
94  (jae @sym)
95  (cmpb ($ x8664::no-thread-local-binding-marker) (@ (% arg_x) (% arg_y)))
96  (je @sym)
97  (shl ($ x8664::word-shift) (% arg_y))
98  (push (% arg_x))
99  (push (% arg_y))
100  (set-nargs 2)
101  (lea (@ '2 (% rsp)) (% temp0))
102  (jmp-subprim .SPvalues)
103  @sym
104  (subb ($ (- x8664::fulltag-symbol x8664::fulltag-misc)) (% arg_z.b))
105  (push (% arg_z))
106  (pushq ($ '#.x8664::symptr.vcell))
107  (set-nargs 2)
108  (lea (@ '2 (% rsp)) (% temp0))
109  (jmp-subprim .SPvalues))
110
111(defx86lapfunction %tcr-binding-location ((tcr arg_y) (sym arg_z))
112  (movq (@ x8664::symbol.binding-index (% sym)) (% arg_x))
113  (movl ($ nil) (% arg_z.l))
114  (rcmp (% arg_x) (@ x8664::tcr.tlb-limit (% tcr)))
115  (movq (@ x8664::tcr.tlb-pointer (% tcr)) (% arg_y))
116  (jae @done)
117  (lea (@ (% arg_y) (% arg_x)) (% arg_y))
118  ;; We're little-endian, so the tag is at the EA with no
119  ;; displacement
120  (cmpb ($ x8664::subtag-no-thread-local-binding) (@ (% arg_y)))
121  (cmovneq (% arg_y) (% arg_z))
122  @done
123  (single-value-return))
124
125 
126(defx86lapfunction %pname-hash ((str arg_y) (len arg_z))
127  (let ((accum imm0)
128        (offset imm1))
129    (xorq (% offset) (% offset))
130    (xorq (% accum) (% accum))
131    (cmpq ($ 0) (% len))
132    (jz.pn @done)
133    @loop8
134    (roll ($ 5) (%l accum))
135    (xorl (@ x8664::misc-data-offset (% str) (% offset) 4) (%l accum))
136    (addq ($ 1) (% offset))   
137    (subq ($ '1) (% len))
138    (jnz @loop8)
139    (shlq ($ 5) (% accum))
140    (shrq ($ (- 5 x8664::fixnumshift)) (% accum))
141    (movq (% accum) (% arg_z))
142    @done
143    (single-value-return)))
144
145(defx86lapfunction %string-hash ((start arg_x) (str arg_y) (len arg_z))
146  (let ((accum imm0)
147        (offset imm1))
148    (unbox-fixnum start offset)
149    (xorq (% accum) (% accum))
150    (cmpq ($ 0) (% len))
151    (jz.pn @done)
152    @loop8
153    (roll ($ 5) (%l accum))
154    (xorl (@ x8664::misc-data-offset (% str) (% offset) 4) (%l accum))
155    (addq ($ 1) (% offset))   
156    (subq ($ '1) (% len))
157    (jnz @loop8)
158    (shlq ($ 5) (% accum))
159    (shrq ($ (- 5 x8664::fixnumshift)) (% accum))
160    (movq (% accum) (% arg_z))
161    @done
162    (single-value-return)))
Note: See TracBrowser for help on using the repository browser.