Changeset 15007
- Timestamp:
- Oct 1, 2011, 12:00:52 AM (13 years ago)
- Location:
- trunk/source/compiler/ARM
- Files:
-
- 3 edited
-
arm-asm.lisp (modified) (2 diffs)
-
arm-vinsns.lisp (modified) (3 diffs)
-
arm2.lisp (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/source/compiler/ARM/arm-asm.lisp
r14972 r15007 203 203 (:non-conditional)) 204 204 205 205 206 ;;; UUOs. 206 207 … … 333 334 #x03400000 334 335 #x0ff00000 336 ()) 337 ;; This canonical NOP also requires ARMv6T2 or later. 338 (define-arm-instruction nop () 339 #x0320f000 340 #x0fffffff 335 341 ()) 336 342 -
trunk/source/compiler/ARM/arm-vinsns.lisp
r14972 r15007 2003 2003 (b label)) 2004 2004 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))) 2011 2013 (tst reg (:$ arm::fixnummask)) 2014 (mov idx (:asr reg (:$ arm::fixnumshift))) 2012 2015 (bne default) 2013 2016 ((:not (:pred zerop minval)) 2014 2017 ((:pred arm::encode-arm-immediate minval) 2015 (sub reg reg(:$ minval)))2018 (sub idx idx (:$ minval))) 2016 2019 ((:not (:pred arm::encode-arm-immediate minval)) 2017 2020 ((:pred arm::encode-arm-immediate (:apply - minval)) 2018 (add reg reg(:$ (:apply - minval))))2021 (add idx idx (:$ (:apply - minval)))) 2019 2022 ((:not (:pred arm::encode-arm-immediate (:apply - minval))) 2020 2023 ((:and (:pred >= minval 0) … … 2026 2029 (movw temp (:$ (:apply logand #xffff minval))) 2027 2030 (movt temp (:$ (:apply ldb (byte 16 16) minval)))) 2028 (sub reg regtemp))))2031 (sub idx idx temp)))) 2029 2032 ((:pred arm::encode-arm-immediate maxval) 2030 (cmp reg(:$ maxval)))2033 (cmp idx (:$ maxval))) 2031 2034 ((:not (:pred arm::encode-arm-immediate maxval)) 2032 2035 ((:pred arm::encode-arm-immediate (:apply lognot maxval)) 2033 (cmn reg(:$ (:apply lognot maxval))))2036 (cmn idx (:$ (:apply lognot maxval)))) 2034 2037 ((:not (:pred arm::encode-arm-immediate (:apply lognot maxval))) 2035 2038 ((:pred (< maxval #x10000)) … … 2038 2041 (movw temp (:$ (:apply logand #xffff maxval))) 2039 2042 (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 2045 2055 2046 2056 -
trunk/source/compiler/ARM/arm2.lisp
r14982 r15007 6362 6362 (t (setf (vinsn-annotation next) condition))))))))))) 6363 6363 6364 (defparameter *arm2-generate-casejump* t) 6364 6365 6365 6366 (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) 6369 6369 (when ranges 6370 6370 (let* ((min (caar ranges)) 6371 6371 (max min) 6372 6372 (count 0) 6373 (all ())) 6373 (all ()) 6374 (labeled-trueforms ())) 6374 6375 (declare (fixnum min max count)) 6375 (when ; determine min,max, count; punt on duplicate keys6376 (when ; determine min,max, count; punt on duplicate keys 6376 6377 (dolist (range ranges t) 6377 6378 (let* ((info (cons (backend-get-next-label) (pop trueforms)))) 6379 (push info labeled-trueforms) 6378 6380 (unless (dolist (val range t) 6379 6381 (declare (fixnum val)) … … 6387 6389 (incf count)) 6388 6390 (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))) 6408 6416 (@ 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))) 6410 6423 (@ 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) 6412 6430 (@ endlabel) 6413 6431 (when (arm2-mvpass-p xfer) 6414 (^)) 6415 t)))))))))) 6432 (let* ((*arm2-returning-values* :mvpass)) 6433 (^))) 6434 t)))))))))))) 6416 6435 6417 6436 … … 6420 6439 (arm2-form seg vreg xfer (if (nx-null test-val) false true)) 6421 6440 (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) 6424 6442 (or (arm2-generate-casejump seg vreg xfer ranges trueforms var otherwise) 6425 6443 (let* ((cstack *arm2-cstack*)
Note:
See TracChangeset
for help on using the changeset viewer.
