📄 array.lisp
字号:
(in-package "SB!VM")(define-assembly-routine (allocate-vector (:policy :fast-safe) (:translate allocate-vector) (:arg-types positive-fixnum positive-fixnum positive-fixnum)) ((:arg type any-reg a0-offset) (:arg length any-reg a1-offset) (:arg words any-reg a2-offset) (:res result descriptor-reg a0-offset) (:temp ndescr non-descriptor-reg nl0-offset) (:temp vector descriptor-reg a3-offset)) (pseudo-atomic () (move alloc-tn vector) (inst dep other-pointer-lowtag 31 3 vector) (inst addi (* (1+ vector-data-offset) n-word-bytes) words ndescr) (inst dep 0 31 3 ndescr) (inst add ndescr alloc-tn alloc-tn) (inst srl type word-shift ndescr) (storew ndescr vector 0 other-pointer-lowtag) (storew length vector vector-length-slot other-pointer-lowtag)) (move vector result));;;; Hash primitives;;; FIXME: This looks kludgy bad and wrong.#+sb-assembling(defparameter *sxhash-simple-substring-entry* (gen-label))(define-assembly-routine (sxhash-simple-string (:translate %sxhash-simple-string) (:policy :fast-safe) (:result-types positive-fixnum)) ((:arg string descriptor-reg a0-offset) (:res result any-reg a0-offset) (:temp length any-reg a1-offset) (:temp accum non-descriptor-reg nl0-offset) (:temp data non-descriptor-reg nl1-offset) (:temp offset non-descriptor-reg nl2-offset)) (declare (ignore result accum data offset)) ;; Save the return address. (inst b *sxhash-simple-substring-entry*) (loadw length string vector-length-slot other-pointer-lowtag))(define-assembly-routine (sxhash-simple-substring (:translate %sxhash-simple-substring) (:policy :fast-safe) (:arg-types * positive-fixnum) (:result-types positive-fixnum)) ((:arg string descriptor-reg a0-offset) (:arg length any-reg a1-offset) (:res result any-reg a0-offset) (:temp accum non-descriptor-reg nl0-offset) (:temp data non-descriptor-reg nl1-offset) (:temp offset non-descriptor-reg nl2-offset)) (emit-label *sxhash-simple-substring-entry*) (inst li (- (* vector-data-offset n-word-bytes) other-pointer-lowtag) offset) (inst b test) (move zero-tn accum) LOOP (inst xor accum data accum) (inst shd accum accum 5 accum) TEST (inst ldwx offset string data) (inst addib :>= (fixnumize -4) length loop) (inst addi (fixnumize 1) offset offset) (inst addi (fixnumize 4) length length) (inst comb := zero-tn length done :nullify t) (inst sub zero-tn length length) (inst sll length 1 length) (inst mtctl length :sar) (inst shd zero-tn data :variable data) (inst xor accum data accum) DONE (inst sll accum 5 result) (inst srl result 3 result))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -