0.pre7.137:
[sbcl.git] / src / compiler / alpha / char.lisp
1 ;;;; the Alpha VM definition of character operations
2
3 ;;;; This software is part of the SBCL system. See the README file for
4 ;;;; more information.
5 ;;;;
6 ;;;; This software is derived from the CMU CL system, which was
7 ;;;; written at Carnegie Mellon University and released into the
8 ;;;; public domain. The software is in the public domain and is
9 ;;;; provided with absolutely no warranty. See the COPYING and CREDITS
10 ;;;; files for more information.
11
12 (in-package "SB!VM")
13 \f
14 ;;;; moves and coercions
15
16 ;;; Move a tagged char to an untagged representation.
17 (define-vop (move-to-base-char)
18   (:args (x :scs (any-reg descriptor-reg)))
19   (:results (y :scs (base-char-reg)))
20   (:generator 1
21     (inst srl x sb!vm:n-widetag-bits y)))
22 ;;;
23 (define-move-vop move-to-base-char :move
24   (any-reg descriptor-reg) (base-char-reg))
25
26 ;;; Move an untagged char to a tagged representation.
27 (define-vop (move-from-base-char)
28   (:args (x :scs (base-char-reg)))
29   (:results (y :scs (any-reg descriptor-reg)))
30   (:generator 1
31     (inst sll x sb!vm:n-widetag-bits y)
32     (inst bis y sb!vm:base-char-widetag y)))
33 ;;;
34 (define-move-vop move-from-base-char :move
35   (base-char-reg) (any-reg descriptor-reg))
36
37 ;;; Move untagged base-char values.
38 (define-vop (base-char-move)
39   (:args (x :target y
40             :scs (base-char-reg)
41             :load-if (not (location= x y))))
42   (:results (y :scs (base-char-reg)
43                :load-if (not (location= x y))))
44   (:effects)
45   (:affected)
46   (:generator 0
47     (move x y)))
48 ;;;
49 (define-move-vop base-char-move :move
50   (base-char-reg) (base-char-reg))
51
52 ;;; Move untagged base-char arguments/return-values.
53 (define-vop (move-base-char-arg)
54   (:args (x :target y
55             :scs (base-char-reg))
56          (fp :scs (any-reg)
57              :load-if (not (sc-is y base-char-reg))))
58   (:results (y))
59   (:generator 0
60     (sc-case y
61       (base-char-reg
62        (move x y))
63       (base-char-stack
64        (storew x fp (tn-offset y))))))
65 ;;;
66 (define-move-vop move-base-char-arg :move-arg
67   (any-reg base-char-reg) (base-char-reg))
68
69
70 ;;; Use standard MOVE-ARG + coercion to move an untagged base-char
71 ;;; to a descriptor passing location.
72 ;;;
73 (define-move-vop move-arg :move-arg
74   (base-char-reg) (any-reg descriptor-reg))
75 \f
76 ;;;; other operations
77
78 (define-vop (char-code)
79   (:translate char-code)
80   (:policy :fast-safe)
81   (:args (ch :scs (base-char-reg) :target res))
82   (:arg-types base-char)
83   (:results (res :scs (any-reg)))
84   (:result-types positive-fixnum)
85   (:generator 1
86     (inst sll ch 2 res)))
87
88 (define-vop (code-char)
89   (:translate code-char)
90   (:policy :fast-safe)
91   (:args (code :scs (any-reg) :target res))
92   (:arg-types positive-fixnum)
93   (:results (res :scs (base-char-reg)))
94   (:result-types base-char)
95   (:generator 1
96     (inst srl code 2 res)))
97 \f
98 ;;;; comparison of BASE-CHARs
99
100 (define-vop (base-char-compare)
101   (:args (x :scs (base-char-reg))
102          (y :scs (base-char-reg)))
103   (:arg-types base-char base-char)
104   (:temporary (:scs (non-descriptor-reg)) temp)
105   (:conditional)
106   (:info target not-p)
107   (:policy :fast-safe)
108   (:note "inline comparison")
109   (:variant-vars cond)
110   (:generator 3
111     (ecase cond
112       (:eq (inst cmpeq x y temp))
113       (:lt (inst cmplt x y temp))
114       (:gt (inst cmplt y x temp)))
115     (if not-p
116         (inst beq temp target)
117         (inst bne temp target))))
118
119 (define-vop (fast-char=/base-char base-char-compare)
120   (:translate char=)
121   (:variant :eq))
122
123 (define-vop (fast-char</base-char base-char-compare)
124   (:translate char<)
125   (:variant :lt))
126
127 (define-vop (fast-char>/base-char base-char-compare)
128   (:translate char>)
129   (:variant :gt))