308ddb055de16f8c57c4cacf4218f8096c925bbc
[sbcl.git] / src / compiler / ppc / char.lisp
1 ;;;
2 ;;; Written by Rob MacLachlan
3 ;;; Converted for the MIPS R2000 by Christopher Hoover.
4 ;;; And then to the SPARC by William Lott.
5 ;;;
6 (in-package "SB!VM")
7
8
9 \f
10 ;;;; Moves and coercions:
11
12 ;;; Move a tagged char to an untagged representation.
13 ;;;
14 (define-vop (move-to-base-char)
15   (:args (x :scs (any-reg descriptor-reg)))
16   (:results (y :scs (base-char-reg)))
17   (:note "character untagging")
18   (:generator 1
19     (inst srwi y x sb!vm:n-widetag-bits)))
20 ;;;
21 (define-move-vop move-to-base-char :move
22   (any-reg descriptor-reg) (base-char-reg))
23
24
25 ;;; Move an untagged char to a tagged representation.
26 ;;;
27 (define-vop (move-from-base-char)
28   (:args (x :scs (base-char-reg)))
29   (:results (y :scs (any-reg descriptor-reg)))
30   (:note "character tagging")
31   (:generator 1
32     (inst slwi y x sb!vm:n-widetag-bits)
33     (inst ori y y sb!vm:base-char-widetag)))
34 ;;;
35 (define-move-vop move-from-base-char :move
36   (base-char-reg) (any-reg descriptor-reg))
37
38 ;;; Move untagged base-char values.
39 ;;;
40 (define-vop (base-char-move)
41   (:args (x :target y
42             :scs (base-char-reg)
43             :load-if (not (location= x y))))
44   (:results (y :scs (base-char-reg)
45                :load-if (not (location= x y))))
46   (:note "character move")
47   (:effects)
48   (:affected)
49   (:generator 0
50     (move y x)))
51 ;;;
52 (define-move-vop base-char-move :move
53   (base-char-reg) (base-char-reg))
54
55
56 ;;; Move untagged base-char arguments/return-values.
57 ;;;
58 (define-vop (move-base-char-arg)
59   (:args (x :target y
60             :scs (base-char-reg))
61          (fp :scs (any-reg)
62              :load-if (not (sc-is y base-char-reg))))
63   (:results (y))
64   (:note "character arg move")
65   (:generator 0
66     (sc-case y
67       (base-char-reg
68        (move y x))
69       (base-char-stack
70        (storew x fp (tn-offset y))))))
71 ;;;
72 (define-move-vop move-base-char-arg :move-arg
73   (any-reg base-char-reg) (base-char-reg))
74
75
76 ;;; Use standard MOVE-ARG + coercion to move an untagged base-char
77 ;;; to a descriptor passing location.
78 ;;;
79 (define-move-vop move-arg :move-arg
80   (base-char-reg) (any-reg descriptor-reg))
81
82
83 \f
84 ;;;; Other operations:
85
86 (define-vop (char-code)
87   (:translate char-code)
88   (:policy :fast-safe)
89   (:args (ch :scs (base-char-reg) :target res))
90   (:arg-types base-char)
91   (:results (res :scs (any-reg)))
92   (:result-types positive-fixnum)
93   (:generator 1
94     (inst slwi res ch 2)))
95
96 (define-vop (code-char)
97   (:translate code-char)
98   (:policy :fast-safe)
99   (:args (code :scs (any-reg) :target res))
100   (:arg-types positive-fixnum)
101   (:results (res :scs (base-char-reg)))
102   (:result-types base-char)
103   (:generator 1
104     (inst srwi res code 2)))
105
106 \f
107 ;;; Comparison of base-chars.
108 ;;;
109 (define-vop (base-char-compare)
110   (:args (x :scs (base-char-reg))
111          (y :scs (base-char-reg)))
112   (:arg-types base-char base-char)
113   (:conditional)
114   (:info target not-p)
115   (:policy :fast-safe)
116   (:note "inline comparison")
117   (:variant-vars condition not-condition)
118   (:generator 3
119     (inst cmplw x y)
120     (inst b? (if not-p not-condition condition) target)))
121
122 (define-vop (fast-char=/base-char base-char-compare)
123   (:translate char=)
124   (:variant :eq :ne))
125
126 (define-vop (fast-char</base-char base-char-compare)
127   (:translate char<)
128   (:variant :lt :ge))
129
130 (define-vop (fast-char>/base-char base-char-compare)
131   (:translate char>)
132   (:variant :gt :le))
133