Changeset 7251


Ignore:
Timestamp:
Sep 18, 2007, 10:23:57 PM (12 years ago)
Author:
rme
Message:

Hairy trap-unless-typecode-= and some other additional vinsns.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/ia32/compiler/X86/X8632/x8632-vinsns.lisp

    r7222 r7251  
    468468(define-x8632-vinsn trap-unless-typecode= (()
    469469                                           ((object :lisp)
    470                                             (tagval :u16const))
    471                                            ((tag :u16)))
    472   (movw (:%w object) (:%w tag))
    473   (andw (:$w x8632::tagmask) (:%w tag))
    474   (cmpw (:$w x8632::tag-misc) (:%w tag))
     470                                            (tagval :u8const))
     471                                           ((tag :u8)))
     472  (movl (:%l object) (:%l tag))
     473  ((:pred = (:apply %hard-regspec-value tag) x8632::eax)
     474   ;; accumulator
     475   (andb (:$b x8632::tagmask) (:%accb tag))
     476   (cmpb (:$b x8632::tag-misc) (:%accb tag)))
     477  ((:and (:pred > (:apply %hard-regspec-value tag) x8632::eax)
     478         (:pred <= (:apply %hard-regspec-value tag) x8632::ebx))
     479   ;; other register that can be treated as a byte
     480   (andb (:$b x8632::tagmask) (:%b tag))
     481   (cmpb (:$b x8632::tag-misc) (:%b tag)))
     482  ((:pred > (:apply %hard-regspec-value tag) x8632::ebx)
     483   ;; non-byte register
     484   (andl (:$l x8632::tagmask) (:%l tag))
     485   (cmpl (:$b x8632::tag-misc) (:%l tag)))
    475486  (jne :have-tag)
    476   (movw (:@ x8632::misc-subtag-offset (:%l object)) (:%w tag))
     487  (movl (:@ x8632::misc-subtag-offset (:%l object)) (:%l tag))
    477488  :have-tag
    478   (cmpw (:$w tagval) (:%w tag))
     489  (cmpl (:$b tagval) (:%l tag))
    479490  (je.pt :ok)
    480491  (uuo-error-reg-not-tag (:%l object) (:$ub tagval))
     
    528539                                      ((temp :u32)))
    529540  (movl (:@ x8632::misc-header-offset (:%l v)) (:%l temp))
    530   (andw (:$w #xff00) (:%w temp))
     541  (xorl (:%l temp) (:%l temp))
    531542  (shrl (:$ub (- x8632::num-subtag-bits x8632::fixnumshift)) (:%l temp))
    532543  (rcmpl (:%l idx) (:%l temp))
     
    920931;;; but it appears that there's isn't a way to enforce
    921932;;; register usage on vinsn args.
    922 ;; (define-x832-vinsn %allocate-uvector (((dest :lisp))
    923 ;;                                    ()
    924 ;;                                    ((header (:u32 #.x8632::eax))
    925 ;;                                     (size (:u32 #.x8632::edx))
    926 ;;                                     (freeptr (:lisp #.x8632::allocptr))))
    927 ;;   (subl (:%l size) (:@ (:%seg :rcontext) x8632::tcr.save-allocptr))
    928 ;;   (movl (:@ (:%seg :rcontext) x8632::tcr.save-allocptr) (%l freeptr))
    929 ;;   (rcmpl (:%l freeptr) (:@ (:%seg :rcontext) x8632::tcr.save-allocbase))
    930 ;;   (jg :no-trap)
    931 ;;   (uuo-alloc)
    932 ;;   :no-trap
    933 ;;   (movl (:%l header) (:@ x8632::misc-header-offset (:%l freeptr)))
    934 ;;   (andb (:$b (lognot x8632::fulltagmask)) (:@ (:%seg :rcontext) x8632::tcr.save-allocptr))
    935 ;;   ((:not (:pred = freeptr
    936 ;;              (:apply %hard-regspec-value dest)))
    937 ;;    (movl (:%l freeptr) (%l dest))))
     933(define-x8632-vinsn %allocate-uvector (((dest :lisp))
     934                                      ()
     935                                      ((header (:u32 #.x8632::eax))
     936                                       (size (:u32 #.x8632::edx))
     937                                       (freeptr (:lisp #.x8632::allocptr))))
     938  (subl (:%l size) (:@ (:%seg :rcontext) x8632::tcr.save-allocptr))
     939  (movl (:@ (:%seg :rcontext) x8632::tcr.save-allocptr) (:%l freeptr))
     940  (rcmpl (:%l freeptr) (:@ (:%seg :rcontext) x8632::tcr.save-allocbase))
     941  (jg :no-trap)
     942  (uuo-alloc)
     943  :no-trap
     944  (movl (:%l header) (:@ x8632::misc-header-offset (:%l freeptr)))
     945  (andb (:$b (lognot x8632::fulltagmask)) (:@ (:%seg :rcontext) x8632::tcr.save-allocptr))
     946  ((:not (:pred = freeptr
     947                (:apply %hard-regspec-value dest)))
     948   (movl (:%l freeptr) (:%l dest))))
    938949
    939950(define-x8632-vinsn set-bigits-after-fixnum-overflow (()
     
    946957  (leal (:@ (:%l src) x8632::fixnumone) (:%l dest)))
    947958
    948 ;;; fix-fixnum-overflow-ool
    949 ;;; fix-fixnum-overflow-ool-and-branch
    950 
     959;;; xxx
     960(define-x8632-vinsn (fix-fixnum-overflow-ool :call)
     961    (((val :lisp))
     962     ((val :lisp))
     963     ((unboxed (:s32 #.x8632::edx))
     964      (header (:u32 #.x8632::imm0))
     965      (entry (:label 1))))
     966  (jno.pt :done)
     967  ((:not (:pred = x8632::arg_z
     968                (:apply %hard-regspec-value val)))
     969   (movl (:%l val) (:%l x8632::arg_z)))
     970  (:talign 5)
     971  (call (:@ .SPfix-overflow))
     972  (movl (:$self 0) (:%l x8632::fn))
     973  ((:not (:pred = x8632::arg_z
     974                (:apply %hard-regspec-value val)))
     975   (movl (:%l x8632::arg_z) (:%l val)))
     976  :done)
     977
     978;;; xxx
    951979(define-x8632-vinsn (fix-fixnum-overflow-ool-and-branch :call)
    952980    (((val :lisp))
     
    14431471  *x8632-vinsn-templates*
    14441472  x86::*x86-opcode-template-lists*))
     1473
     1474(define-x8632-subprim-call-vinsn (integer-sign) .SPinteger-sign)
     1475
     1476(define-x8632-subprim-call-vinsn (misc-ref) .SPmisc-ref)
     1477
     1478(define-x8632-subprim-call-vinsn (ksignalerr) .SPksignalerr)
     1479
     1480(define-x8632-subprim-call-vinsn (misc-alloc-init) .SPmisc-alloc-init)
     1481
     1482(define-x8632-subprim-call-vinsn (misc-alloc) .SPmisc-alloc)
     1483
Note: See TracChangeset for help on using the changeset viewer.