Changeset 7936


Ignore:
Timestamp:
Dec 26, 2007, 7:44:05 AM (12 years ago)
Author:
gb
Message:

More tweaks.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/working-0711/ccl/compiler/X86/X8664/x8664-vinsns.lisp

    r7896 r7936  
    524524(define-x8664-vinsn compare-to-nil (()
    525525                                    ((arg0 t)))
    526   (cmpl (:$l x8664::nil-value) (:%l arg0)))
     526  (cmpb (:$b x8664::fulltag-nil) (:%b arg0)))
    527527
    528528
     
    764764(define-x8664-vinsn extract-tag (((tag :u8))
    765765                                 ((object :lisp)))
    766   (movzbl (:%b object) (:%l tag))
    767   (andb (:$b x8664::tagmask) (:%b tag)))
     766  (movl (:%l object) (:%l tag))
     767  (andl (:$b x8664::tagmask) (:%l tag)))
    768768
    769769(define-x8664-vinsn extract-tag-fixnum (((tag :imm))
    770770                                        ((object :lisp)))
    771   (leal (:@ (:%q object) 8) (:%l tag))
     771  ((:pred =
     772          (:apply %hard-regspec-value tag)
     773          (:apply %hard-regspec-value object))
     774   (shll (:$ub x8664::fixnumshift) (:%l object)))
     775  ((:not (:pred =
     776          (:apply %hard-regspec-value tag)
     777          (:apply %hard-regspec-value object)))
     778   (imull (:$b x8664::fixnumone) (:%l object) (:%l tag)))
    772779  (andl (:$b (ash x8664::tagmask x8664::fixnumshift)) (:%l tag)))
    773780
    774781(define-x8664-vinsn extract-fulltag (((tag :u8))
    775782                                 ((object :lisp)))
    776   (movzbl (:%b object) (:%l tag))
    777   (andb (:$b x8664::fulltagmask) (:%b tag)))
     783  (movl (:%l object) (:%l tag))
     784  (andl (:$b x8664::fulltagmask) (:%l tag)))
    778785
    779786(define-x8664-vinsn extract-fulltag-fixnum (((tag :imm))
    780787                                            ((object :lisp)))
    781   (leal (:@ (:%q object) 8) (:%l tag))
     788  ((:pred =
     789          (:apply %hard-regspec-value tag)
     790          (:apply %hard-regspec-value object))
     791   (shll (:$ub x8664::fixnumshift) (:%l object)))
     792  ((:not (:pred =
     793          (:apply %hard-regspec-value tag)
     794          (:apply %hard-regspec-value object)))
     795   (imull (:$b x8664::fixnumone) (:%l object) (:%l tag)))
    782796  (andl (:$b (ash x8664::fulltagmask x8664::fixnumshift)) (:%l tag)))
    783797
    784798(define-x8664-vinsn extract-typecode (((tag :u32))
    785799                                      ((object :lisp)))
    786   (movzbl (:%b object) (:%l tag))
    787   (andb (:$b x8664::tagmask) (:%b tag))
    788   (cmpb (:$b x8664::tag-misc) (:%b tag))
     800  (movl (:%l object) (:%l tag))
     801  (andl (:$b x8664::tagmask) (:%l tag))
     802  (cmpl (:$b x8664::tag-misc) (:%l tag))
    789803  (jne :have-tag)
    790804  (movzbl (:@ x8664::misc-subtag-offset (:%q object)) (:%l tag))
     
    800814  (movzbl (:@ x8664::misc-subtag-offset (:%q object)) (:%l temp))
    801815  :have-tag
    802   (leal (:@ (:%q temp) 8) (:%l tag)))
     816  (imulq (:$b x8664::fixnumone) (:%q temp) (:%q tag)))
    803817
    804818
     
    812826
    813827(define-x8664-vinsn cr-bit->boolean (((dest :lisp))
    814                                      ((crbit :u8const))
    815                                      ((temp :u32)))
    816   (movl (:$l x8664::t-value) (:%l temp))
    817   (leaq (:@ (- x8664::t-offset) (:%q temp)) (:%q dest))
    818   (cmovccl (:$ub crbit) (:%l temp) (:%l dest)))
     828                                     ((crbit :u8const)))
     829  (movl (:$l x8664::nil-value) (:%l dest))
     830  (cmovccl (:$ub crbit) (:@ (+ x8664::t-offset x8664::symbol.vcell) (:%l dest)) (:%l dest)))
     831
     832
    819833
    820834
     
    12291243      (header (:u64 #.x8664::imm0))
    12301244      (entry (:label 1))))
    1231   (jno.pt :done)
     1245  (jo :overflow)
     1246  :done
     1247  (:uuo-section)
    12321248  ((:not (:pred = x8664::arg_z
    12331249                (:apply %hard-regspec-value val)))
     1250   :overflow
    12341251   (movq (:%q val) (:%q x8664::arg_z)))
    12351252  (:talign 4)
     1253  ((:pred = x8664::arg_z
     1254          (:apply %hard-regspec-value val))
     1255   :overflow)
    12361256  (call (:@ .SPfix-overflow))
    12371257  (leaq (:@ (:^ entry) (:% x8664::rip)) (:%q x8664::fn))
     
    12391259                (:apply %hard-regspec-value val)))
    12401260   (movq (:%q x8664::arg_z) (:%q val)))
    1241   :done)
     1261  (jmp :done))
    12421262
    12431263(define-x8664-vinsn (fix-fixnum-overflow-ool-and-branch :call)
     
    12481268      (header (:u64 #.x8664::imm0))
    12491269      (entry (:label 1))))
    1250   (jno.pt lab)
     1270  (jo :overflow)
     1271  (jmp lab)
     1272  (:uuo-section)
    12511273  ((:not (:pred = x8664::arg_z
    12521274                (:apply %hard-regspec-value val)))
     1275     :overflow
    12531276   (movq (:%q val) (:%q x8664::arg_z)))
    12541277  (:talign 4)
     1278  ((:pred = x8664::arg_z
     1279          (:apply %hard-regspec-value val))
     1280   :overflow)
    12551281  (call (:@ .SPfix-overflow))
    12561282  (leaq (:@ (:^ entry) (:% x8664::rip)) (:%q x8664::fn))
     
    17711797
    17721798(defmacro define-x8664-subprim-jump-vinsn ((name &rest other-attrs) spno)
    1773   `(define-x8664-vinsn (,name :jump :jumpLR ,@other-attrs) (() ())
     1799  `(define-x8664-vinsn (,name :jumpLR ,@other-attrs) (() ())
    17741800    (jmp (:@ ,spno))))
    17751801
     
    29142940  (movq (:%q object) (:%q tag))
    29152941  (je.pt :ok-if-non-negative)
    2916   (andb (:$b x8664::fulltagmask) (:%b tag))
    2917   (cmpb (:$b x8664::fulltag-misc) (:%b tag))
    2918   (jne.pn :bad)
     2942  (andl (:$b x8664::fulltagmask) (:%l tag))
     2943  (cmpl (:$b x8664::fulltag-misc) (:%l tag))
     2944  (jne :bad)
    29192945  (cmpq (:$l x8664::two-digit-bignum-header) (:@ x8664::misc-header-offset (:%q object)))
    29202946  (je :two)
     
    29472973
    29482974
    2949 
     2975;;; set DEST to
    29502976(define-x8664-vinsn mask-base-char (((dest :u8))
    29512977                                    ((src :lisp)))
     
    34183444;;; really known, it should probably be inlined (stack-cleanup, value
    34193445;;; transfer & jump ...)
    3420 (define-x8664-vinsn (throw :jump :jump-unknown) (()
    3421                                                 ()
    3422                                                  ((entry (:label 1))))
     3446(define-x8664-vinsn (throw :jump-unknown) (()
     3447                                          ()
     3448                                           ((entry (:label 1))))
    34233449  (leaq (:@ (:^ :back) (:%q x8664::fn)) (:%q x8664::ra0))
    34243450  (:talign 4)
    34253451  (jmp (:@ .SPthrow))
    34263452  :back
    3427   (leaq (:@ (:^ entry) (:% x8664::rip)) (:%q x8664::fn)))
     3453  (leaq (:@ (:^ entry) (:% x8664::rip)) (:%q x8664::fn))
     3454  (uuo-error-reg-not-tag (:%q x8664::temp0) (:$ub x8664::subtag-catch-frame)))
    34283455
    34293456
Note: See TracChangeset for help on using the changeset viewer.