Changeset 15007


Ignore:
Timestamp:
Oct 1, 2011, 7:00:52 AM (8 years ago)
Author:
gb
Message:

arm-asm.lisp: define the canonical (ARMv6T2+) nop instruction.

arm-vinsns.lisp, arm2.lisp: CASE via jumptable sometimes on ARM, too.

Location:
trunk/source/compiler/ARM
Files:
3 edited

Legend:

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

    r14972 r15007  
    203203     (:non-conditional))
    204204
     205
    205206;;; UUOs.
    206207
     
    333334     #x03400000
    334335     #x0ff00000
     336     ())
     337   ;; This canonical NOP also requires ARMv6T2 or later.
     338   (define-arm-instruction nop ()
     339     #x0320f000
     340     #x0fffffff
    335341     ())
    336342
  • trunk/source/compiler/ARM/arm-vinsns.lisp

    r14972 r15007  
    20032003  (b label))
    20042004
    2005 (define-arm-vinsn (cjmp :branch) (((reg :lisp))
    2006                                   ((reg :lisp)
    2007                                    (minval :s32const)
    2008                                    (maxval :u32const)
    2009                                    (default :label))
    2010                                   ((temp :s32)))
     2005
     2006(define-arm-vinsn (skip-unless-fixnum-in-range :branch)
     2007    (((idx :u32))
     2008     ((reg :imm)
     2009      (minval :s32const)
     2010      (maxval :u32const)
     2011      (default :label))
     2012     ((temp :s32)))
    20112013  (tst reg (:$ arm::fixnummask))
     2014  (mov idx (:asr reg (:$  arm::fixnumshift)))
    20122015  (bne default)
    20132016  ((:not (:pred zerop minval))
    20142017   ((:pred arm::encode-arm-immediate minval)
    2015     (sub reg reg (:$ minval)))
     2018    (sub idx idx (:$ minval)))
    20162019   ((:not (:pred arm::encode-arm-immediate minval))
    20172020    ((:pred arm::encode-arm-immediate (:apply - minval))
    2018      (add reg reg (:$ (:apply - minval))))
     2021     (add idx idx (:$ (:apply - minval))))
    20192022    ((:not (:pred arm::encode-arm-immediate (:apply - minval)))
    20202023     ((:and (:pred >=  minval 0)
     
    20262029      (movw temp (:$ (:apply logand #xffff minval)))
    20272030      (movt temp (:$ (:apply ldb (byte 16 16) minval))))
    2028      (sub reg reg temp))))
     2031     (sub idx idx temp))))
    20292032  ((:pred arm::encode-arm-immediate maxval)
    2030    (cmp reg (:$ maxval)))
     2033   (cmp idx (:$ maxval)))
    20312034  ((:not (:pred arm::encode-arm-immediate maxval))
    20322035   ((:pred arm::encode-arm-immediate (:apply lognot maxval))
    2033     (cmn reg (:$ (:apply lognot maxval))))
     2036    (cmn idx (:$ (:apply lognot maxval))))
    20342037   ((:not (:pred arm::encode-arm-immediate (:apply lognot maxval)))
    20352038    ((:pred (< maxval #x10000))
     
    20382041     (movw temp (:$ (:apply logand #xffff maxval)))
    20392042     (movt temp (:$ (:apply ldb (byte 16 16) maxval))))
    2040     (cmp reg temp)))
    2041   (bhi default)
    2042   (add arm::lr arm::pc reg)
    2043   (bx lr))
    2044            
     2043    (cmp idx temp)))
     2044  (bhs default))
     2045
     2046(define-arm-vinsn (ijmp :branch) (()
     2047                                  ((idx :u32)))
     2048  (add arm::pc arm::pc (:lsl idx (:$ 2)))
     2049  (nop))
     2050
     2051(define-arm-vinsn nop (()
     2052                       ())
     2053  (nop))
     2054
    20452055
    20462056
  • trunk/source/compiler/ARM/arm2.lisp

    r14982 r15007  
    63626362                      (t (setf (vinsn-annotation next) condition)))))))))))
    63636363
     6364(defparameter *arm2-generate-casejump* t)
    63646365
    63656366(defun arm2-generate-casejump (seg vreg xfer ranges trueforms var otherwise)
    6366   (declare (ignorable trueforms var otherwise))
    6367   (with-arm-local-vinsn-macros (seg vreg xfer)
    6368     (unless (arm2-mvpass-p xfer)
     6367  (when *arm2-generate-casejump*
     6368    (with-arm-local-vinsn-macros (seg vreg xfer)
    63696369      (when ranges
    63706370        (let* ((min (caar ranges))
    63716371               (max min)
    63726372               (count 0)
    6373                (all ()))
     6373               (all ())
     6374               (labeled-trueforms ()))
    63746375          (declare (fixnum min max count))
    6375           (when ; determine min,max, count; punt on duplicate keys
     6376          (when                         ; determine min,max, count; punt on duplicate keys
    63766377              (dolist (range ranges t)
    63776378                (let* ((info (cons (backend-get-next-label) (pop trueforms))))
     6379                  (push info labeled-trueforms)
    63786380                  (unless (dolist (val range t)
    63796381                            (declare (fixnum val))
     
    63876389                            (incf count))
    63886390                    (return nil))))
    6389                 (let* ((span (1+ (- max min))))
    6390                   (declare (fixnum span))
    6391                   (when (and (> count 4)
    6392                              (> count (the fixnum (- span (the fixnum (ash span -2))))))
    6393                     (let* ((defaultlabel (backend-get-next-label))
    6394                            (endlabel (backend-get-next-label))
    6395                            (reg ($ arm::arg_z)))
    6396                       (arm2-use-operator (%nx1-operator lexical-reference)
    6397                                          seg reg nil var)
    6398                       (! cjmp reg (ash min arm::fixnumshift) (ash (- max min) arm::fixnumshift)  (aref *backend-labels* defaultlabel))
    6399                       (do* ((val min (1+ val)))
    6400                            ((> val max))
    6401                         (declare (fixnum val))
    6402                         (let* ((info (assoc val all)))
    6403                           (! non-barrier-jump (aref *backend-labels* (if info (cadr info) defaultlabel)))))
    6404                       (let* ((target (arm2-cd-merge xfer endlabel)))
    6405                         (dolist (case (nreverse all))
    6406                           (let* ((lab (cadr case))
    6407                                  (form (cddr case)))
     6391            (let* ((span (1+ (- max min))))
     6392              (when (and (> count 4)
     6393                         (>= count (the fixnum (- span (the fixnum (ash span -2))))))
     6394                (let* ((defaultlabel (backend-get-next-label))
     6395                       (endlabel (backend-get-next-label))
     6396                       (single-clause (and (eql count span)
     6397                                           (eql (length labeled-trueforms) 1))))
     6398                  (let* ((reg (arm2-one-untargeted-reg-form seg (make-acode (%nx1-operator lexical-reference) var) arm::arg_z)))
     6399                    (with-imm-target () (idx :u32)
     6400                      (! skip-unless-fixnum-in-range idx reg min span  (aref *backend-labels* defaultlabel))
     6401
     6402                      (unless single-clause
     6403                        (! ijmp idx)
     6404                        (do* ((val min (1+ val)))
     6405                             ((> val max) (! nop))
     6406                          (declare (fixnum val))
     6407                          (let* ((info (assoc val all)))
     6408                            (! non-barrier-jump (aref *backend-labels* (if info (cadr info) defaultlabel))))))
     6409                      (let* ((target (if (arm2-mvpass-p xfer)
     6410                                       (logior $backend-mvpass-mask endlabel)
     6411                                       (arm2-cd-merge xfer endlabel)))
     6412                             (entry-stack (arm2-encode-stack)))
     6413                        (dolist (case (nreverse labeled-trueforms))
     6414                          (let* ((lab (car case))
     6415                                 (form (cdr case)))
    64086416                            (@ lab)
    6409                             (arm2-form seg vreg target form)))
     6417                            (multiple-value-setq (*arm2-undo-count*
     6418                                                  *arm2-cstack*
     6419                                                  *arm2-vstack*
     6420                                                  *arm2-top-vstack-lcell*)
     6421                              (arm2-decode-stack entry-stack))
     6422                            (arm2-undo-body seg vreg target form entry-stack)))
    64106423                        (@ defaultlabel)
    6411                         (arm2-form seg vreg target otherwise)
     6424                        (multiple-value-setq (*arm2-undo-count*
     6425                                              *arm2-cstack*
     6426                                              *arm2-vstack*
     6427                                              *arm2-top-vstack-lcell*)
     6428                          (arm2-decode-stack entry-stack))
     6429                        (arm2-undo-body seg vreg target otherwise entry-stack)
    64126430                        (@ endlabel)
    64136431                        (when (arm2-mvpass-p xfer)
    6414                           (^))
    6415                         t))))))))))
     6432                          (let* ((*arm2-returning-values* :mvpass))
     6433                            (^)))
     6434                        t))))))))))))
    64166435                       
    64176436
     
    64206439    (arm2-form seg vreg xfer (if (nx-null test-val) false true))
    64216440    (multiple-value-bind (ranges trueforms var otherwise)
    6422         #+notyet (nx2-reconstruct-case testform true false)
    6423         #-notyet (values nil nil nil nil)
     6441        (nx2-reconstruct-case testform true false)
    64246442      (or (arm2-generate-casejump seg vreg xfer ranges trueforms var otherwise)
    64256443          (let* ((cstack *arm2-cstack*)
Note: See TracChangeset for help on using the changeset viewer.