0.6.12.3:
[sbcl.git] / src / compiler / alpha / subprim.lisp
1 ;;; -*- Package: ALPHA; Log: C.Log -*-
2 ;;;
3 ;;; **********************************************************************
4 ;;; This code was written as part of the CMU Common Lisp project at
5 ;;; Carnegie Mellon University, and has been placed in the public domain.
6 ;;;
7
8 ;;;
9 ;;; **********************************************************************
10 ;;;
11 ;;;    Linkage information for standard static functions, and random vops.
12 ;;;
13 ;;; Written by William Lott.
14 ;;; Converted by Sean Hallgren.
15 ;;; 
16 (in-package "SB!VM")
17
18
19
20 \f
21 ;;;; Length
22
23 (define-vop (length/list)
24   (:translate length)
25   (:args (object :scs (descriptor-reg) :target ptr))
26   (:arg-types list)
27   (:temporary (:scs (descriptor-reg) :from (:argument 0)) ptr)
28   (:temporary (:scs (non-descriptor-reg)) temp)
29   (:temporary (:scs (any-reg) :type fixnum :to (:result 0) :target result)
30               count)
31   (:results (result :scs (any-reg descriptor-reg)))
32   (:policy :fast-safe)
33   (:vop-var vop)
34   (:save-p :compute-only)
35   (:generator 50
36     (move object ptr)
37     (move zero-tn count)
38     
39     LOOP
40     
41     (inst cmpeq ptr null-tn temp)
42     (inst bne temp done)
43     
44     (inst and ptr lowtag-mask temp)
45     (inst xor temp list-pointer-type temp)
46     (inst bne temp not-list)
47     
48     (loadw ptr ptr cons-cdr-slot list-pointer-type)
49     (inst addq count (fixnumize 1) count)
50     (inst br zero-tn loop)
51     
52     NOT-LIST
53     (cerror-call vop done object-not-list-error ptr)
54     
55     DONE
56     (move count result)))
57        
58
59 (define-static-function length (object) :translate length)
60
61
62