Changeset 9935


Ignore:
Timestamp:
Jul 10, 2008, 8:42:06 AM (11 years ago)
Author:
gb
Message:

Treat nargs as having at least 32 significant bits.
Avoid partial register writes in a few cases.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/working-0711/ccl/compiler/X86/x86-lapmacros.lisp

    r9578 r9935  
    4343        ,anchor
    4444        ,(if (eql min 0)
    45              `(testw (%w nargs) (%w nargs))
    46              `(rcmp (%w nargs) ($ ',min)))
     45             `(testl (% nargs) (% nargs))
     46             `(rcmp (% nargs) ($ ',min)))
    4747        (jne ,bad)
    4848        (:anchored-uuo-section ,anchor)
     
    5454          `(progn
    5555            ,anchor
    56             (rcmp (%w nargs) ($ ',min))
     56            (rcmp (% nargs) ($ ',min))
    5757            (jb ,bad)
    5858            (:anchored-uuo-section ,anchor)
     
    6363          `(progn
    6464            ,anchor
    65             (rcmp (%w nargs) ($ ',max))
     65            (rcmp (% nargs) ($ ',max))
    6666            (ja ,bad)
    6767            (:anchored-uuo-section ,anchor)
     
    7373            `(progn
    7474              ,anchor
    75               (rcmp (%w nargs) ($ ',min))
     75              (rcmp (% nargs) ($ ',min))
    7676              (jb ,toofew)
    77               (rcmp (%w nargs) ($ ',max))
     77              (rcmp (% nargs) ($ ',max))
    7878              (ja ,toomany)
    7979              (:anchored-uuo-section ,anchor)
     
    8888(defx86lapmacro extract-lisptag (node dest)
    8989  `(progn
    90     (movb ($ x8664::tagmask) (%b ,dest))
    91     (andb (%b ,node) (%b ,dest))))
     90    (movl (%l ,node) (%l ,dest))
     91    (andl ($ x8664::tagmask) (%l ,dest))))
    9292
    9393(defx86lapmacro extract-fulltag (node dest)
    9494  `(progn
    95     (movb ($ x8664::fulltagmask) (%b ,dest))
    96     (andb (%b ,node) (%b ,dest))))
     95    (movl (%l ,node) (%l ,dest))
     96    (andl ($ x8664::fulltagmask) (%l ,dest))))
    9797
    9898(defx86lapmacro extract-subtag (node dest)
     
    100100
    101101(defx86lapmacro extract-typecode (node dest)
    102   ;;; In general, these things are only defined to affect the low
    103   ;;; byte of the destination register.  This can also affect
    104   ;;; the #xff00 byte.
    105102  (let* ((done (gensym)))
    106103    `(progn
     
    108105      (rcmp (%b ,dest) ($ x8664::tag-misc))
    109106      (jne ,done)
    110       (movb (@  x8664::misc-subtag-offset (% ,node)) (%b ,dest))
     107      (movzbl (@  x8664::misc-subtag-offset (% ,node)) (%l ,dest))
    111108      ,done)))
    112109
    113110(defx86lapmacro trap-unless-typecode= (node tag &optional (immreg 'imm0))
    114   (let* ((ok (gensym)))
    115     `(progn
     111  (let* ((bad (gensym))
     112         (anchor (gensym)))
     113    `(progn
     114      ,anchor
    116115      (extract-typecode ,node ,immreg)
    117116      (cmpb ($ ,tag) (%b ,immreg))
    118       (je.pt ,ok)
    119       (uuo-error-reg-not-tag (% ,node) ($ ,tag))
    120       ,ok)))
     117      (jne ,bad)
     118      (:anchored-uuo-section ,anchor)
     119      ,bad
     120      (anchored-uuo (uuo-error-reg-not-tag (% ,node) ($ ,tag)))
     121      (:main-section nil))))
    121122
    122123(defx86lapmacro trap-unless-fulltag= (node tag &optional (immreg 'imm0))
    123   (let* ((ok (gensym)))
    124     `(progn
     124  (let* ((bad (gensym))
     125         (anchor (gensym)))
     126    `(progn
     127      ,anchor
    125128      (extract-fulltag ,node ,immreg)
    126129      (cmpb ($ ,tag) (%b ,immreg))
    127       (je.pt ,ok)
    128       (uuo-error-reg-not-tag (% ,node) ($ ,tag))
    129       ,ok)))
     130      (jne ,bad)
     131      (:anchored-uuo-section ,anchor)
     132      ,bad
     133      (anchored-uuo (uuo-error-reg-not-tag (% ,node) ($ ,tag)))
     134      (:main-section nil))))
    130135
    131136(defx86lapmacro trap-unless-lisptag= (node tag &optional (immreg 'imm0))
    132   (let* ((ok (gensym)))
    133     `(progn
     137  (let* ((bad (gensym))
     138         (anchor (gensym)))
     139    `(progn
     140      ,anchor
    134141      (extract-lisptag ,node ,immreg)
    135142      (cmpb ($ ,tag) (%b ,immreg))
    136       (je.pt ,ok)
    137       (uuo-error-reg-not-tag (% ,node) ($ ,tag))
    138       ,ok)))
     143      (jne ,bad)
     144      (:anchored-uuo-section ,anchor)
     145      ,bad
     146      (anchored-uuo (uuo-error-reg-not-tag (% ,node) ($ ,tag)))
     147      (:main-section nil))))
    139148
    140149(defx86lapmacro trap-unless-fixnum (node)
    141   (let* ((ok (gensym)))
    142     `(progn
     150  (let* ((bad (gensym))
     151         (anchor (gensym)))
     152    `(progn
     153      ,anchor
    143154      (testb ($ x8664::tagmask) (%b ,node))
    144       (je.pt ,ok)
    145       (uuo-error-reg-not-fixnum (% ,node))
    146       ,ok)))
     155      (jne ,bad)
     156      (:anchored-uuo-section ,anchor)
     157      ,bad
     158      (anchored-uuo (uuo-error-reg-not-fixnum (% ,node)))
     159      (:main-section nil))))
    147160
    148161;;; On x8664, NIL has its own tag, so no other lisp object can
     
    368381         (z (gensym)))
    369382  `(progn
    370     (testw (%w nargs) (%w nargs))
     383    (testl (% nargs) (% nargs))
    371384    (je ,done)
    372     (cmpw ($ '2) (%w nargs))
     385    (cmpl ($ '2) (% nargs))
    373386    (je ,yz)
    374387    (jb ,z)
Note: See TracChangeset for help on using the changeset viewer.