Changeset 14898


Ignore:
Timestamp:
Jul 21, 2011, 10:19:22 AM (8 years ago)
Author:
gb
Message:

CJMP vinsn generates prologue for a computed jump.

File:
1 edited

Legend:

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

    r14847 r14898  
    19711971  (b label))
    19721972
     1973(define-arm-vinsn (cjmp :branch) (((reg :lisp))
     1974                                  ((reg :lisp)
     1975                                   (minval :s32const)
     1976                                   (maxval :u32const)
     1977                                   (default :label))
     1978                                  ((temp :s32)))
     1979  (tst reg (:$ arm::fixnummask))
     1980  (bne default)
     1981  ((:not (:pred zerop minval))
     1982   ((:pred arm::encode-arm-immediate minval)
     1983    (sub reg reg (:$ minval)))
     1984   ((:not (:pred arm::encode-arm-immediate minval))
     1985    ((:pred arm::encode-arm-immediate (:apply - minval))
     1986     (add reg reg (:$ (:apply - minval))))
     1987    ((:not (:pred arm::encode-arm-immediate (:apply - minval)))
     1988     ((:and (:pred >=  minval 0)
     1989            (:pred < minval #x10000))
     1990      (movw temp (:$ minval)))
     1991     ((:not (:and
     1992             (:pred >=  minval 0)
     1993             (:pred < minval #x10000)))
     1994      (movw temp (:$ (:apply logand #xffff minval)))
     1995      (movt temp (:$ (:apply ldb (byte 16 16) minval))))
     1996     (sub reg reg temp))))
     1997  ((:pred arm::encode-arm-immediate maxval)
     1998   (cmp reg (:$ maxval)))
     1999  ((:not (:pred arm::encode-arm-immediate maxval))
     2000   ((:pred arm::encode-arm-immediate (:apply lognot maxval))
     2001    (cmn reg (:$ (:apply lognot maxval))))
     2002   ((:not (:pred arm::encode-arm-immediate (:apply lognot maxval)))
     2003    ((:pred (< maxval #x10000))
     2004     (movw temp (:$ maxval)))
     2005    ((:not (:pred (< maxval #x10000)))
     2006     (movw temp (:$ (:apply logand #xffff maxval)))
     2007     (movt temp (:$ (:apply ldb (byte 16 16) maxval))))
     2008    (cmp reg temp)))
     2009  (bhi default)
     2010  (add arm::lr arm::pc reg)
     2011  (bx lr))
     2012           
     2013
     2014
     2015     
     2016                                   
    19732017
    19742018(define-arm-vinsn (cbranch-true :branch) (()
Note: See TracChangeset for help on using the changeset viewer.