Changeset 14940


Ignore:
Timestamp:
Aug 16, 2011, 1:43:43 PM (13 years ago)
Author:
Gary Byers
Message:

In things defined by DEFARM2-SF-OP and DEFARM2-DF-OP, try to ensure that
the result register is disjoint from operands when generating "safe" code,
so that operands can be reported more reliably in case of an exception.

Define %FIXNUM-REF-DOUBLE-FLOAT and %FIXNUM-SET-DOUBLE-FLOAT in the front
end; implement the in the ARM backend (so far.)

Location:
trunk/source/compiler
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/source/compiler/ARM/arm-vinsns.lisp

    r14939 r14940  
    40044004  (mvn dest temp))
    40054005
     4006(define-arm-vinsn fixnum-ref-c-double-float (((dest :double-float))
     4007                                             ((base :imm)
     4008                                              (idx :u32const)))
     4009  (fldd dest (:@ base (:$ (:apply ash idx 3)))))
     4010
     4011(define-arm-vinsn fixnum-ref-double-float (((dest :double-float))
     4012                                           ((base :imm)
     4013                                            (idx :imm))
     4014                                           ((temp :imm)))
     4015  (add temp base (:lsl idx (:$ 1)))
     4016  (fldd dest (:@ temp (:$ 0))))
     4017
     4018(define-arm-vinsn fixnum-set-c-double-float (()
     4019                                             ((base :imm)
     4020                                              (idx :u32const)
     4021                                              (val :double-float)))
     4022  (fstd val (:@ base (:$ (:apply ash idx 3)))))
     4023
     4024
     4025(define-arm-vinsn fixnum-set-double-float (()
     4026                                           ((base :imm)
     4027                                            (idx :imm)
     4028                                            (val :double-float))
     4029                                           ((temp :imm)))
     4030  (add temp base (:lsl idx (:$ 1)))
     4031  (fstd val (:@ temp (:$ 0))))
     4032                                             
     4033
    40064034;;; In case arm::*arm-opcodes* was changed since this file was compiled.
    40074035#+maybe-never
  • trunk/source/compiler/ARM/arm2.lisp

    r14939 r14940  
    62006200    (arm2-form seg vreg xfer (if (nx-null test-val) false true))
    62016201    (multiple-value-bind (ranges trueforms var otherwise)
    6202         #+notyet (nx2-reconstruct-case testform true false)
    6203         #-notyet (values nil nil nil nil)
     6202        (nx2-reconstruct-case testform true false)
    62046203      (or (arm2-generate-casejump seg vreg xfer ranges trueforms var otherwise)
    62056204          (let* ((cstack *arm2-cstack*)
     
    69346933               (if (= (hard-regspec-class vreg) hard-reg-class-fpr)
    69356934                 (if *arm2-float-safety*
    6936                      (! ,safe-vinsn vreg r1 r2)
    6937                      (! ,vinsn vreg r1 r2))
     6935                   (with-fp-target (r1 r2) (result :double-float)
     6936                     (! ,safe-vinsn result r1 r2)
     6937                     (<- result))
     6938                   (! ,vinsn vreg r1 r2))
    69386939                 (with-fp-target (r1 r2) (result :double-float)
    69396940                   (if *arm2-float-safety*
     
    69556956               (if (= (hard-regspec-class vreg) hard-reg-class-fpr)
    69566957                 (if *arm2-float-safety*
    6957                    (! ,safe-vinsn vreg r1 r2)
     6958                   (with-fp-target (r1 r2) (result :single-float)
     6959                     (! ,safe-vinsn result r1 r2)
     6960                     (<- result))
    69586961                   (! ,vinsn vreg r1 r2))
    69596962                 (with-fp-target (r1 r2) (result :single-float)
     
    88378840        (arm2-two-targeted-reg-forms seg num ($ arm::arg_y) amt ($ arm::arg_z))
    88388841        (arm2-fixed-call-builtin seg vreg xfer '.SPbuiltin-ash))))
     8842
     8843(defarm2 arm2-fixnum-ref-double-float %fixnum-ref-double-float (seg vreg xfer base index)
     8844  (if (null vreg)
     8845    (progn
     8846      (arm2-form base seg nil nil)
     8847      (arm2-form index seg nil xfer))
     8848    (let* ((fix (acode-fixnum-form-p index)))
     8849      (unless (typep fix '(integer 0 (128)))
     8850        (setq fix nil))
     8851      (if (and (= (hard-regspec-class vreg) hard-reg-class-fpr)
     8852               (= (get-regspec-mode vreg) hard-reg-class-fpr-mode-double) )
     8853        (cond (fix
     8854               (! fixnum-ref-c-double-float vreg (arm2-one-untargeted-reg-form seg base arm::arg_z) fix))
     8855              (t
     8856               (multiple-value-bind (rbase rindex) (arm2-two-untargeted-reg-forms seg base arm::arg_y index arm::arg_z)
     8857                 (! fixnum-ref-double-float vreg rbase rindex))))
     8858        (with-fp-target () (target :double-float)
     8859        (cond (fix
     8860               (! fixnum-ref-c-double-float target (arm2-one-untargeted-reg-form seg base arm::arg_z) fix))
     8861              (t
     8862               (multiple-value-bind (rbase rindex) (arm2-two-untargeted-reg-forms seg base arm::arg_y index arm::arg_z)
     8863                 (! fixnum-ref-double-float target rbase rindex))))
     8864        (<- target)))
     8865      (^))))
     8866
     8867(defarm2 arm2-fixnum-set-double-float %fixnum-set-double-float (seg vreg xfer base index val)
     8868  (let* ((fix (acode-fixnum-form-p index)))
     8869    (unless (typep fix '(integer 0 (128)))
     8870      (setq fix nil))
     8871    (cond ((or (null vreg)
     8872               (and (= (hard-regspec-class vreg) hard-reg-class-fpr)
     8873                    (= (get-regspec-mode vreg) hard-reg-class-fpr-mode-double)))
     8874           (let* ((fhint (or vreg ($ arm::d0 :class :fpr :mode :double-float))))
     8875             (if fix
     8876               (multiple-value-bind (rbase rval)
     8877                   (arm2-two-untargeted-reg-forms seg base ($ arm::arg_z) val fhint)
     8878                 (! fixnum-set-c-double-float rbase fix rval)
     8879                 (<- rval))
     8880               (multiple-value-bind (rbase rindex rval)
     8881                   (arm2-three-untargeted-reg-forms seg base ($ arm::arg_y) index ($ arm::arg_z) val fhint)
     8882                 (! fixnum-set-double-float rbase rindex rval)
     8883                 (<- rval)))))
     8884          (t
     8885           (if fix
     8886             (multiple-value-bind (rbase rboxed)
     8887                 (arm2-two-untargeted-reg-forms seg base ($ arm::arg_y) val ($ arm::arg_z))
     8888               (with-fp-target () (rval :double-float)
     8889                 (arm2-copy-register seg rval rboxed)
     8890                 (! fixnum-set-c-double-float rbase fix rval))
     8891               (<- rboxed))
     8892             (multiple-value-bind (rbase rindex rboxed)
     8893                 (arm2-three-untargeted-reg-forms seg base ($ arm::arg_x) index ($ arm::arg_y) val ($ arm::arg_z))
     8894               (with-fp-target () (rval :double-float)
     8895                 (arm2-copy-register seg rval rboxed)
     8896                 (! fixnum-set-double-float rbase rindex rval))
     8897               (<- rboxed)))))
     8898    (^)))
  • trunk/source/compiler/nx1.lisp

    r14773 r14940  
    222222              (nx1-form base)
    223223              (nx1-form offset)))
     224
     225(defnx1 nx1-fixnum-ref-double-float ((%fixnum-ref-double-float)) (base &optional (index 0))
     226  (make-acode (%nx1-operator typed-form)
     227               'double-float
     228               (make-acode (%nx1-operator %fixnum-ref-double-float)
     229                           (nx1-form base)
     230                           (nx1-form index))))
     231
     232(defnx1 nx2-fixnum-set-double-float ((%fixnum-set-double-float)) (base index-or-val &optional (val nil val-p))
     233  (unless val-p
     234    (setq val index-or-val index-or-val 0))
     235  (make-acode (%nx1-operator typed-form)
     236               'double-float
     237               (make-acode (%nx1-operator %fixnum-set-double-float)
     238                           (nx1-form base)
     239                           (nx1-form index-or-val)
     240                           (nx1-form val))))
     241               
    224242
    225243(defnx1 nx1-type-unaryop ((typecode) (lisptag) (fulltag))
  • trunk/source/compiler/nxenv.lisp

    r14757 r14940  
    207207     (%badarg1 . 0)
    208208     (%badarg2 . 0)
    209      (newblocktag . 0)
    210      (newgotag . 0)
     209     (%fixnum-ref-double-float . #.(logior operator-acode-subforms-mask  operator-single-valued-mask))
     210     (%fixnum-set-double-float . #.(logior operator-acode-subforms-mask  operator-single-valued-mask))
    211211     (flet . 0)                         ; may not be necessary - for dynamic-extent, mostly
    212212                                        ; for dynamic-extent, forward refs, etc.
Note: See TracChangeset for help on using the changeset viewer.