⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sap.lisp

📁 开源跨平台Lisp编译器
💻 LISP
📖 第 1 页 / 共 2 页
字号:
                                (:constant ,(if (eq size :double)                                                ;; We need to be able to add 4.                                                `(integer ,(- (ash 1 16))                                                          ,(- (ash 1 16) 5))                                              '(signed-byte 16))))                    ,@(when (or (eq size :byte) (eq size :short))                        `((:temporary (:scs (non-descriptor-reg)) temp)                          (:temporary (:sc non-descriptor-reg) temp1)))                    (:info offset)                    (:results (result :scs (,sc)))                    (:result-types ,type)                    (:generator 4                                ,@(ecase size                                    (:byte                                     (if signed                                         '((inst ldq_u temp offset object)                                           (inst lda temp1 (1+ offset) object)                                           (inst extqh temp temp1 temp)                                           (inst sra temp 56 result))                                       '((inst ldq_u temp offset object)                                         (inst lda temp1 offset object)                                         (inst extbl temp temp1 result))))                                    (:short                                     (if signed                                         '((inst ldq_u temp offset object)                                           (inst lda temp1 offset object)                                           (inst extwl temp temp1 temp)                                           (inst sll temp 48 temp)                                           (inst sra temp 48 result))                                       '((inst ldq_u temp offset object)                                         (inst lda temp1 offset object)                                         (inst extwl temp temp1 result))))                                    (:long                                     `((inst ldl result offset object)                                       ,@(unless signed                                           '((inst mskll result 4 result)))))                                    (:quad                                     '((inst ldq result offset object)))                                    (:single                                     '((inst lds result offset object)))                                    (:double                                     '((inst ldt                                             result                                             (+ offset n-word-bytes)                                             object))))))                  (define-vop (,set-name)                    (:translate ,set-name)                    (:policy :fast-safe)                    (:args (object :scs (sap-reg) :target sap)                           (offset :scs (signed-reg))                           (value :scs (,sc) :target result))                    (:arg-types system-area-pointer signed-num ,type)                    (:results (result :scs (,sc)))                    (:result-types ,type)                    (:temporary (:scs (sap-reg) :from (:argument 0)) sap)                    ,@(when (or (eq size :byte) (eq size :short))                        `((:temporary (:sc non-descriptor-reg) temp)                          (:temporary (:sc non-descriptor-reg) temp1)                          (:temporary (:sc non-descriptor-reg) temp2)))                    (:generator 5                                (inst addq object offset sap)                                ,@(ecase size                                    (:byte                                     '((inst lda temp 0 sap)                                       (inst ldq_u temp1 0 sap)                                       (inst insbl value temp temp2)                                       (inst mskbl temp1 temp temp1)                                       (inst bis temp1 temp2 temp1)                                       (inst stq_u temp1 0 sap)                                       (inst move value result)))                                    (:short                                     '((inst lda temp 0 sap)                                       (inst ldq_u temp1 0 sap)                                       (inst mskwl temp1 temp temp1)                                       (inst inswl value temp temp2)                                       (inst bis temp1 temp2 temp)                                       (inst stq_u temp 0 sap)                                       (inst move value result)))                                    (:long                                     '((inst stl value 0 sap)                                       (move value result)))                                    (:quad                                     '((inst stq value 0 sap)                                       (move value result)))                                    (:single                                     '((unless (location= result value)                                         (inst fmove value result))                                       (inst sts value 0 sap)))                                    (:double                                     '((unless (location= result value)                                         (inst fmove value result))                                       (inst stt value 0 sap))))))                  (define-vop (,set-name-c)                    (:translate ,set-name)                    (:policy :fast-safe)                    (:args (object :scs (sap-reg))                           (value :scs (,sc) :target result))                    (:arg-types system-area-pointer                                (:constant ,(if (eq size :double)                                                ;; We need to be able to add 4.                                                `(integer ,(- (ash 1 16))                                                          ,(- (ash 1 16) 5))                                              '(signed-byte 16)))                                ,type)                    ,@(when (or (eq size :byte) (eq size :short))                        `((:temporary (:sc non-descriptor-reg) temp)                          (:temporary (:sc non-descriptor-reg) temp1)                          (:temporary (:sc non-descriptor-reg) temp2)))                    (:info offset)                    (:results (result :scs (,sc)))                    (:result-types ,type)                    (:generator 5                                ,@(ecase size                                    (:byte                                     '((inst lda temp offset object)                                       (inst ldq_u temp1 offset object)                                       (inst insbl value temp temp2)                                       (inst mskbl temp1 temp temp1)                                       (inst bis temp1 temp2 temp1)                                       (inst stq_u temp1 offset object)                                       (inst move value result)))                                    (:short                                     '((inst lda temp offset object)                                       (inst ldq_u temp1 offset object)                                       (inst mskwl temp1 temp temp1)                                       (inst inswl value temp temp2)                                       (inst bis temp1 temp2 temp)                                       (inst stq_u temp offset object)                                       (inst move value result)))                                    (:long                                     '((inst stl value offset object)                                       (move value result)))                                    (:quad                                     '((inst stq value offset object)                                       (move value result)))                                    (:single                                     '((unless (location= result value)                                         (inst fmove value result))                                       (inst sts value offset object)))                                    (:double                                     '((unless (location= result value)                                         (inst fmove value result))                                       (inst stt value offset object))))))))))  (def-system-ref-and-set sap-ref-8 %set-sap-ref-8    unsigned-reg positive-fixnum :byte nil)  (def-system-ref-and-set signed-sap-ref-8 %set-signed-sap-ref-8    signed-reg tagged-num :byte t)  (def-system-ref-and-set sap-ref-16 %set-sap-ref-16    unsigned-reg positive-fixnum :short nil)  (def-system-ref-and-set signed-sap-ref-16 %set-signed-sap-ref-16    signed-reg tagged-num :short t)  (def-system-ref-and-set sap-ref-32 %set-sap-ref-32    unsigned-reg unsigned-num :long nil)  (def-system-ref-and-set signed-sap-ref-32 %set-signed-sap-ref-32    signed-reg signed-num :long t)  (def-system-ref-and-set sap-ref-64 %set-sap-ref-64    unsigned-reg unsigned-num :quad nil)  (def-system-ref-and-set signed-sap-ref-64 %set-signed-sap-ref-64    signed-reg signed-num :quad t)  (def-system-ref-and-set sap-ref-sap %set-sap-ref-sap    sap-reg system-area-pointer :quad)  (def-system-ref-and-set sap-ref-single %set-sap-ref-single    single-reg single-float :single)  (def-system-ref-and-set sap-ref-double %set-sap-ref-double    double-reg double-float :double));;; noise to convert normal Lisp data objects into SAPs(define-vop (vector-sap)  (:translate vector-sap)  (:policy :fast-safe)  (:args (vector :scs (descriptor-reg)))  (:results (sap :scs (sap-reg)))  (:result-types system-area-pointer)  (:generator 2    (inst lda sap          (- (* vector-data-offset n-word-bytes) other-pointer-lowtag)          vector)))

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -