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

📄 float.lisp

📁 开源跨平台Lisp编译器
💻 LISP
📖 第 1 页 / 共 3 页
字号:
;;;; the HPPA VM definition of floating point operations;;;; This software is part of the SBCL system. See the README file for;;;; more information.;;;;;;;; This software is derived from the CMU CL system, which was;;;; written at Carnegie Mellon University and released into the;;;; public domain. The software is in the public domain and is;;;; provided with absolutely no warranty. See the COPYING and CREDITS;;;; files for more information.(in-package "SB!VM");;;; Move functions.(define-move-fun (load-fp-zero 1) (vop x y)  ((fp-single-zero) (single-reg)   (fp-double-zero) (double-reg))  (inst funop :copy x y))(defun ld-float (offset base r)  (cond ((< offset (ash 1 4))         (inst flds offset base r))        (t         (inst ldo offset zero-tn lip-tn)         (inst fldx lip-tn base r))))(define-move-fun (load-float 1) (vop x y)  ((single-stack) (single-reg)   (double-stack) (double-reg))  (let ((offset (* (tn-offset x) n-word-bytes)))    (ld-float offset (current-nfp-tn vop) y)))(defun str-float (x offset base)  (cond ((< offset (ash 1 4))         (inst fsts x offset base))        (t         (inst ldo offset zero-tn lip-tn)         (inst fstx x lip-tn base))))(define-move-fun (store-float 1) (vop x y)  ((single-reg) (single-stack)   (double-reg) (double-stack))  (let ((offset (* (tn-offset y) n-word-bytes)))    (str-float x offset (current-nfp-tn vop))));;;; Move VOPs(define-vop (move-float)  (:args (x :scs (single-reg double-reg)            :target y            :load-if (not (location= x y))))  (:results (y :scs (single-reg double-reg)               :load-if (not (location= x y))))  (:note "float move")  (:generator 0    (unless (location= y x)      (inst funop :copy x y))))(define-move-vop move-float :move (single-reg) (single-reg))(define-move-vop move-float :move (double-reg) (double-reg))(define-vop (move-from-float)  (:args (x :to :save))  (:results (y :scs (descriptor-reg)))  (:temporary (:scs (non-descriptor-reg)) ndescr)  (:variant-vars size type data)  (:note "float to pointer coercion")  (:generator 13    (with-fixed-allocation (y ndescr type size)      (inst fsts x (- (* data n-word-bytes) other-pointer-lowtag) y))))(macrolet ((frob (name sc &rest args)             `(progn                (define-vop (,name move-from-float)                  (:args (x :scs (,sc) :to :save))                  (:variant ,@args))                (define-move-vop ,name :move (,sc) (descriptor-reg)))))  (frob move-from-single single-reg    single-float-size single-float-widetag single-float-value-slot)  (frob move-from-double double-reg    double-float-size double-float-widetag double-float-value-slot))(define-vop (move-to-float)  (:args (x :scs (descriptor-reg)))  (:results (y))  (:variant-vars offset)  (:note "pointer to float coercion")  (:generator 2    (inst flds (- (* offset n-word-bytes) other-pointer-lowtag) x y)))(macrolet ((frob (name sc offset)             `(progn                (define-vop (,name move-to-float)                  (:results (y :scs (,sc)))                  (:variant ,offset))                (define-move-vop ,name :move (descriptor-reg) (,sc)))))  (frob move-to-single single-reg single-float-value-slot)  (frob move-to-double double-reg double-float-value-slot))(define-vop (move-float-arg)  (:args (x :scs (single-reg double-reg) :target y)         (nfp :scs (any-reg)              :load-if (not (sc-is y single-reg double-reg))))  (:results (y))  (:note "float argument move")  (:generator 1    (sc-case y      ((single-reg double-reg)       (unless (location= x y)         (inst funop :copy x y)))      ((single-stack double-stack)       (let ((offset (* (tn-offset y) n-word-bytes)))         (str-float x offset nfp))))))(define-move-vop move-float-arg :move-arg  (single-reg descriptor-reg) (single-reg))(define-move-vop move-float-arg :move-arg  (double-reg descriptor-reg) (double-reg));;;; Complex float move functions(defun complex-single-reg-real-tn (x)  (make-random-tn :kind :normal :sc (sc-or-lose 'single-reg)                  :offset (tn-offset x)))(defun complex-single-reg-imag-tn (x)  (make-random-tn :kind :normal :sc (sc-or-lose 'single-reg)                  :offset (1+ (tn-offset x))))(defun complex-double-reg-real-tn (x)  (make-random-tn :kind :normal :sc (sc-or-lose 'double-reg)                  :offset (tn-offset x)))(defun complex-double-reg-imag-tn (x)  (make-random-tn :kind :normal :sc (sc-or-lose 'double-reg)                  :offset (1+ (tn-offset x))))(define-move-fun (load-complex-single 2) (vop x y)  ((complex-single-stack) (complex-single-reg))  (let ((nfp (current-nfp-tn vop))        (offset (* (tn-offset x) n-word-bytes)))    (let ((real-tn (complex-single-reg-real-tn y)))      (ld-float offset nfp real-tn))    (let ((imag-tn (complex-single-reg-imag-tn y)))      (ld-float (+ offset n-word-bytes) nfp imag-tn))))(define-move-fun (store-complex-single 2) (vop x y)  ((complex-single-reg) (complex-single-stack))  (let ((nfp (current-nfp-tn vop))        (offset (* (tn-offset y) n-word-bytes)))    (let ((real-tn (complex-single-reg-real-tn x)))      (str-float real-tn offset nfp))    (let ((imag-tn (complex-single-reg-imag-tn x)))      (str-float imag-tn (+ offset n-word-bytes) nfp))))(define-move-fun (load-complex-double 4) (vop x y)  ((complex-double-stack) (complex-double-reg))  (let ((nfp (current-nfp-tn vop))        (offset (* (tn-offset x) n-word-bytes)))    (let ((real-tn (complex-double-reg-real-tn y)))      (ld-float offset nfp real-tn))    (let ((imag-tn (complex-double-reg-imag-tn y)))      (ld-float (+ offset (* 2 n-word-bytes)) nfp imag-tn))))(define-move-fun (store-complex-double 4) (vop x y)  ((complex-double-reg) (complex-double-stack))  (let ((nfp (current-nfp-tn vop))        (offset (* (tn-offset y) n-word-bytes)))    (let ((real-tn (complex-double-reg-real-tn x)))      (str-float real-tn offset nfp))    (let ((imag-tn (complex-double-reg-imag-tn x)))      (str-float imag-tn (+ offset (* 2 n-word-bytes)) nfp))));;; Complex float register to register moves.(define-vop (complex-single-move)  (:args (x :scs (complex-single-reg) :target y            :load-if (not (location= x y))))  (:results (y :scs (complex-single-reg) :load-if (not (location= x y))))  (:note "complex single float move")  (:generator 0     (unless (location= x y)       ;; Note the complex-float-regs are aligned to every second       ;; float register so there is not need to worry about overlap.       (let ((x-real (complex-single-reg-real-tn x))             (y-real (complex-single-reg-real-tn y)))         (inst funop :copy x-real y-real))       (let ((x-imag (complex-single-reg-imag-tn x))             (y-imag (complex-single-reg-imag-tn y)))         (inst funop :copy x-imag y-imag)))))(define-move-vop complex-single-move :move  (complex-single-reg) (complex-single-reg))(define-vop (complex-double-move)  (:args (x :scs (complex-double-reg)            :target y :load-if (not (location= x y))))  (:results (y :scs (complex-double-reg) :load-if (not (location= x y))))  (:note "complex double float move")  (:generator 0     (unless (location= x y)       ;; Note the complex-float-regs are aligned to every second       ;; float register so there is not need to worry about overlap.       (let ((x-real (complex-double-reg-real-tn x))             (y-real (complex-double-reg-real-tn y)))         (inst funop :copy x-real y-real))       (let ((x-imag (complex-double-reg-imag-tn x))             (y-imag (complex-double-reg-imag-tn y)))         (inst funop :copy x-imag y-imag)))))(define-move-vop complex-double-move :move  (complex-double-reg) (complex-double-reg));;; Move from a complex float to a descriptor register allocating a;;; new complex float object in the process.(define-vop (move-from-complex-single)  (:args (x :scs (complex-single-reg) :to :save))  (:results (y :scs (descriptor-reg)))  (:temporary (:scs (non-descriptor-reg)) ndescr)  (:note "complex single float to pointer coercion")  (:generator 13     (with-fixed-allocation (y ndescr complex-single-float-widetag                               complex-single-float-size)       (let ((real-tn (complex-single-reg-real-tn x)))         (inst fsts real-tn (- (* complex-single-float-real-slot n-word-bytes)                               other-pointer-lowtag)               y))       (let ((imag-tn (complex-single-reg-imag-tn x)))         (inst fsts imag-tn (- (* complex-single-float-imag-slot n-word-bytes)                               other-pointer-lowtag)               y)))))(define-move-vop move-from-complex-single :move  (complex-single-reg) (descriptor-reg))(define-vop (move-from-complex-double)  (:args (x :scs (complex-double-reg) :to :save))  (:results (y :scs (descriptor-reg)))  (:temporary (:scs (non-descriptor-reg)) ndescr)  (:note "complex double float to pointer coercion")  (:generator 13     (with-fixed-allocation (y ndescr complex-double-float-widetag                               complex-double-float-size)       (let ((real-tn (complex-double-reg-real-tn x)))         (inst fsts real-tn (- (* complex-double-float-real-slot n-word-bytes)                               other-pointer-lowtag)               y))       (let ((imag-tn (complex-double-reg-imag-tn x)))         (inst fsts imag-tn (- (* complex-double-float-imag-slot n-word-bytes)                               other-pointer-lowtag)               y)))))(define-move-vop move-from-complex-double :move  (complex-double-reg) (descriptor-reg));;; Move from a descriptor to a complex float register(define-vop (move-to-complex-single)  (:args (x :scs (descriptor-reg)))  (:results (y :scs (complex-single-reg)))  (:note "pointer to complex float coercion")  (:generator 2    (let ((real-tn (complex-single-reg-real-tn y)))      (inst flds (- (* complex-single-float-real-slot n-word-bytes)                    other-pointer-lowtag)            x real-tn))    (let ((imag-tn (complex-single-reg-imag-tn y)))      (inst flds (- (* complex-single-float-imag-slot n-word-bytes)                    other-pointer-lowtag)            x imag-tn))))(define-move-vop move-to-complex-single :move  (descriptor-reg) (complex-single-reg))(define-vop (move-to-complex-double)  (:args (x :scs (descriptor-reg)))  (:results (y :scs (complex-double-reg)))  (:note "pointer to complex float coercion")  (:generator 2    (let ((real-tn (complex-double-reg-real-tn y)))      (inst flds (- (* complex-double-float-real-slot n-word-bytes)                    other-pointer-lowtag)            x real-tn))    (let ((imag-tn (complex-double-reg-imag-tn y)))      (inst flds (- (* complex-double-float-imag-slot n-word-bytes)                    other-pointer-lowtag)            x imag-tn))))(define-move-vop move-to-complex-double :move  (descriptor-reg) (complex-double-reg));;; Complex float move-arg vop(define-vop (move-complex-single-float-arg)  (:args (x :scs (complex-single-reg) :target y)         (nfp :scs (any-reg) :load-if (not (sc-is y complex-single-reg))))  (:results (y))  (:note "float argument move")  (:generator 1    (sc-case y      (complex-single-reg       (unless (location= x y)         (let ((x-real (complex-single-reg-real-tn x))               (y-real (complex-single-reg-real-tn y)))           (inst funop :copy x-real y-real))         (let ((x-imag (complex-single-reg-imag-tn x))               (y-imag (complex-single-reg-imag-tn y)))           (inst funop :copy x-imag y-imag))))      (complex-single-stack       (let ((offset (* (tn-offset y) n-word-bytes)))         (let ((real-tn (complex-single-reg-real-tn x)))           (str-float real-tn offset nfp))         (let ((imag-tn (complex-single-reg-imag-tn x)))           (str-float imag-tn (+ offset n-word-bytes) nfp)))))))(define-move-vop move-complex-single-float-arg :move-arg  (complex-single-reg descriptor-reg) (complex-single-reg))(define-vop (move-complex-double-float-arg)  (:args (x :scs (complex-double-reg) :target y)         (nfp :scs (any-reg) :load-if (not (sc-is y complex-double-reg))))

⌨️ 快捷键说明

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