source: trunk/source/level-0/X86/X8632/x8632-symbol.lisp @ 10330

Last change on this file since 10330 was 10330, checked in by rme, 11 years ago

%STRING-HASH for x8632.

File size: 4.1 KB
Line 
1(in-package "CCL")
2
3(eval-when (:compile-toplevel :execute)
4  (require "X8632-ARCH")
5  (require "X86-LAPMACROS"))
6
7;;; This assumes that macros & special-operators
8;;; have something that's not FUNCTIONP in their
9;;; function-cells.  It also assumes that NIL
10;;; isn't a true symbol, but that NILSYM is.
11(defx8632lapfunction %function ((sym arg_z))
12  (check-nargs 1)
13  (let ((symaddr temp0))
14    (movl ($ (+ x8632::nil-value x8632::nilsym-offset)) (% symaddr))
15    (cmp-reg-to-nil sym)
16    (cmovne (% sym) (% symaddr))
17    (trap-unless-typecode= symaddr x8632::subtag-symbol)
18    (movl (% sym) (% arg_y))
19    (movl (@ x8632::symbol.fcell (% symaddr)) (% arg_z))
20    (extract-typecode arg_z imm0)
21    (cmpb ($ x8632::subtag-function) (%b imm0))
22    (je.pt @ok)
23    (uuo-error-udf (% arg_y))
24    @ok
25    (single-value-return)))
26
27;;; Traps unless sym is NIL or some other symbol.  If NIL, return
28;;; nilsym
29(defx8632lapfunction %symbol->symptr ((sym arg_z))
30  (let ((tag imm0))
31    (movl ($ (+ x8632::nil-value x8632::nilsym-offset)) (% tag))
32    (cmp-reg-to-nil sym)
33    (cmove (% sym) (% tag))
34    (je :done)
35    (trap-unless-typecode= sym x8632::subtag-symbol)
36    :done
37    (single-value-return)))
38
39;;; If symptr is NILSYM, return NIL; else typecheck and return symptr
40(defx8632lapfunction %symptr->symbol ((symptr arg_z))
41  (cmpl ($ (+ x8632::nil-value x8632::nilsym-offset)) (% symptr))
42  (jne @typecheck)
43  (movl ($ x8632::nil-value) (% arg_z))
44  (single-value-return)
45  @typecheck
46  (trap-unless-typecode= symptr x8632::subtag-symbol)
47  (single-value-return))
48
49(defx8632lapfunction %symptr-value ((symptr arg_z))
50  (jmp-subprim .SPspecref))
51
52(defx8632lapfunction %set-symptr-value ((symptr arg_y) (val arg_z))
53  (jmp-subprim .SPspecset))
54
55;;; This gets a tagged symbol as an argument.
56;;; If there's no thread-local binding, it should return
57;;; the underlying symbol vector as a first return value.
58(defx8632lapfunction %symptr-binding-address ((symptr arg_z))
59  (movl (@ x8632::symbol.binding-index (% symptr)) (% arg_y))
60  (rcmp (% arg_y) (@ (% :rcontext) x8632::tcr.tlb-limit))
61  (movl (@ (% :rcontext) x8632::tcr.tlb-pointer) (% temp0))
62  (jae @sym)
63  (cmpb ($ x8632::subtag-no-thread-local-binding) (@ (% temp0) (% arg_y)))
64  (je @sym)
65  (shl ($ x8632::word-shift) (% arg_y))
66  (push (% temp0))
67  (push (% arg_y))
68  (set-nargs 2)
69  (lea (@ '2 (% esp)) (% temp0))
70  (jmp-subprim .SPvalues)
71  @sym
72  (push (% arg_z))
73  (pushl ($ '#.x8632::symbol.vcell))
74  (set-nargs 2)
75  (lea (@ '2 (% esp)) (% temp0))
76  (jmp-subprim .SPvalues))
77
78(defx8632lapfunction %tcr-binding-location ((tcr arg_y) (sym arg_z))
79  (movl (@ x8632::symbol.binding-index (% sym)) (% temp0))
80  (movl ($ x8632::nil-value) (% arg_z))
81  (rcmp (% temp0) (@ x8632::tcr.tlb-limit (% tcr)))
82  (movl (@ x8632::tcr.tlb-pointer (% tcr)) (% arg_y))
83  (jae @done)
84  (lea (@ (% arg_y) (% temp0)) (% arg_y))
85  ;; We're little-endian, so the tag is at the EA with no
86  ;; displacement
87  (cmpb ($ x8632::subtag-no-thread-local-binding) (@ (% arg_y)))
88  (cmovnel (% arg_y) (% arg_z))
89  @done
90  (single-value-return))
91
92(defx86lapfunction %pname-hash ((str arg_y) (len arg_z))
93  (let ((accum imm0)
94        (offset temp0))
95    (xor (% offset) (% offset))
96    (xor (% accum) (% accum))
97    (testl (% len) (% len))
98    (jz.pn @done)
99    @loop8
100    (roll ($ 5) (%l accum))
101    (xorl (@ x8632::misc-data-offset (% str) (% offset)) (%l accum))
102    (addl ($ '1) (% offset))
103    (subl ($ '1) (% len))
104    (jnz @loop8)
105    (shll ($ 5) (% accum))
106    (shrl ($ (- 5 x8632::fixnumshift)) (% accum))
107    (movl (% accum) (% arg_z))
108    @done
109    (single-value-return)))
110
111(defx8632lapfunction %string-hash ((start 4) #|(ra 0)|# (str arg_y) (len arg_z))
112  (let ((accum imm0)
113        (offset temp0))
114    (movl (@ start (% esp)) (% offset))
115    (xorl (% accum) (% accum))
116    (testl (% len) (% len))
117    (jz @done)
118    @loop8
119    (roll ($ 5) (%l accum))
120    (xorl (@ x8632::misc-data-offset (% str) (% offset)) (%l accum))
121    (addl ($ '1) (% offset))
122    (subl ($ '1) (% len))
123    (jnz @loop8)
124    (shll ($ 5) (% accum))
125    (shrl ($ (- 5 x8632::fixnumshift)) (% accum))
126    (movl (% accum) (% arg_z))
127    @done
128    (single-value-return 3)))
Note: See TracBrowser for help on using the repository browser.