Changeset 9710


Ignore:
Timestamp:
Jun 9, 2008, 1:24:52 AM (11 years ago)
Author:
gb
Message:

Changes from trunk: do comparisons to T, lisp constants without temp
reg. Try to avoid more partial-register, word operations.

Location:
branches/working-0711-perf/ccl/compiler/X86
Files:
2 edited

Legend:

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

    r9492 r9710  
    307307  :resume
    308308  ((:pred = n 0)
    309    (testw (:%w x8664::nargs) (:%w x8664::nargs)))
     309   (testl (:%l x8664::nargs) (:%l x8664::nargs)))
    310310  ((:not (:pred = n 0))
    311    (cmpw (:$w (:apply ash n x8664::word-shift)) (:%w x8664::nargs)))
     311   ((:pred < n 16)
     312   (cmpl (:$b (:apply ash n x8664::word-shift)) (:%l x8664::nargs)))
     313   ((:pred >= n 16)
     314    (cmpl (:$l (:apply ash n x8664::word-shift)) (:%l x8664::nargs))))
    312315  (jne :bad)
    313316  (:anchored-uuo-section :resume)
     
    319322  :resume
    320323  ((:pred = min 1)
    321    (testw (:%w x8664::nargs) (:%w x8664::nargs))
     324   (testl (:%l x8664::nargs) (:%l x8664::nargs))
    322325   (je :toofew))
    323326  ((:not (:pred = min 1))
    324    (rcmpw (:%w x8664::nargs) (:$w (:apply ash min x8664::word-shift)))
     327   ((:pred < min 16)
     328    (rcmpl (:%l x8664::nargs) (:$b (:apply ash min x8664::word-shift))))
     329   ((:pred >= min 16)
     330    (rcmpl (:%l x8664::nargs) (:$l (:apply ash min x8664::word-shift))))
    325331   (jb :toofew)) 
    326332 
     
    332338                                       ((n :u16const)))
    333339  :resume
    334   (rcmpw (:%w x8664::nargs) (:$w (:apply ash n x8664::word-shift)))
     340  ((:pred < n 16)
     341   (rcmpl (:%l x8664::nargs) (:$b (:apply ash n x8664::word-shift))))
     342  ((:pred >= n 16)
     343   (rcmpl (:%l x8664::nargs) (:$l (:apply ash n x8664::word-shift))))
    335344  (ja :bad)
    336345 
     
    345354  :resume
    346355  ((:pred = min 1)
    347    (testw (:%w x8664::nargs) (:%w x8664::nargs))
     356   (testl (:%l x8664::nargs) (:%l x8664::nargs))
    348357   (je :toofew))
    349358  ((:not (:pred = min 1))
    350    (rcmpw (:%w x8664::nargs) (:$w (:apply ash min x8664::word-shift)))
     359   ((:pred < min 16)
     360    (rcmpl (:%l x8664::nargs) (:$b (:apply ash min x8664::word-shift))))
     361   ((:pred >= min 16)
     362    (rcmpl (:%l x8664::nargs) (:$l (:apply ash min x8664::word-shift))))
    351363   (jb :toofew))
    352   (rcmpw (:%w x8664::nargs) (:$w (:apply ash max x8664::word-shift)))
     364  ((:pred < max 16)
     365   (rcmpl (:%l x8664::nargs) (:$b (:apply ash max x8664::word-shift))))
     366  ((:pred >= max 16)
     367   (rcmpl (:%l x8664::nargs) (:$l (:apply ash max x8664::word-shift))))
    353368  (ja :toomany)
    354369 
     
    363378(define-x8664-vinsn default-1-arg (()
    364379                                   ((min :u16const)))
    365   (rcmpw (:%w x8664::nargs) (:$w (:apply ash min x8664::word-shift)))
     380  ((:pred < min 16)
     381   (rcmpl (:%l x8664::nargs) (:$b (:apply ash min x8664::word-shift))))
     382  ((:pred >= min 16)
     383   (rcmpl (:%l x8664::nargs) (:$l (:apply ash min x8664::word-shift))))
    366384  (jne :done)
    367385  ((:pred >= min 3)
     
    377395(define-x8664-vinsn default-2-args (()
    378396                                    ((min :u16const)))
    379   (rcmpw (:%w x8664::nargs ) (:$w (:apply ash (:apply 1+ min) x8664::word-shift)))
     397  ((:pred < (:apply 1+ min) 16)
     398   (rcmpl (:%l x8664::nargs ) (:$b (:apply ash (:apply 1+ min) x8664::word-shift))))
     399  ((:pred >= (:apply 1+ min) 16)
     400   (rcmpl (:%l x8664::nargs ) (:$l (:apply ash (:apply 1+ min) x8664::word-shift))))
    380401  (ja :done)
    381402  (je :one)
     
    402423(define-x8664-vinsn default-3-args (()
    403424                                    ((min :u16const)))
    404   (rcmpw (:%w x8664::nargs ) (:$w (:apply ash (:apply + 2 min) x8664::word-shift)))
     425  ((:pred < (:apply + 2 min) 16)
     426   (rcmpl (:%l x8664::nargs ) (:$b (:apply ash (:apply + 2 min) x8664::word-shift))))
     427  ((:pred >= (:apply + 2 min) 16)
     428   (rcmpl (:%l x8664::nargs ) (:$l (:apply ash (:apply + 2 min) x8664::word-shift))))
    405429  (ja :done)
    406430  (je :two)
    407   (rcmpw (:%w x8664::nargs ) (:$w (:apply ash min x8664::word-shift)))
     431  ((:pred < min 16)
     432   (rcmpl (:%l x8664::nargs ) (:$b (:apply ash min x8664::word-shift))))
     433  ((:pred >= min 16)
     434   (rcmpl (:%l x8664::nargs ) (:$l (:apply ash min x8664::word-shift))))
    408435  (je :none)
    409436  ;; The first (of three) &optional args was supplied.
     
    440467                                       ((n :u16const))
    441468                                       ((temp :u64)))
    442   (rcmpw (:%w x8664::nargs) (:$w (:apply ash n x8664::word-shift)))
    443   (movw (:%w x8664::nargs) (:%w temp))
     469  ((:pred < n 16)
     470   (rcmpl (:%l x8664::nargs) (:$b (:apply ash n x8664::word-shift))))
     471  ((:pred >= n 16)
     472   (rcmpl (:%l x8664::nargs) (:$l (:apply ash n x8664::word-shift))))
     473  (movl (:%l x8664::nargs) (:%l temp))
    444474  (jae :done)
    445475  :loop
    446   (addw (:$w x8664::fixnumone) (:%w temp))
    447   (cmpw (:$w (:apply ash n x8664::word-shift)) (:%w temp))
     476  (addl (:$b x8664::fixnumone) (:%l temp))
     477  ((:pred < n 16)
     478   (cmpl (:$b (:apply ash n x8664::word-shift)) (:%l temp)))
     479  ((:pred >= n 16)
     480   (cmpl (:$l (:apply ash n x8664::word-shift)) (:%l temp))) 
    448481  (pushq (:$l x8664::nil-value))
    449482  (jne :loop)
     
    466499                                                          ()
    467500                                                          ((temp :u64)))
    468   (movzwl (:%w x8664::nargs) (:%l temp))
     501  (movl (:%l x8664::nargs) (:%l temp))
    469502  (subq (:$b (* $numx8664argregs x8664::node-size)) (:%q temp))
    470503  (jle :push)
     
    483516                                                ()
    484517                                                ((temp :u64)))
    485   (movzwl (:%w x8664::nargs) (:%l temp))
     518  (movl (:%l x8664::nargs) (:%l temp))
    486519  (subq (:$b (* $numx8664argregs x8664::node-size)) (:%q temp))
    487520  (movq (:%q x8664::rbp) (:@ x8664::node-size (:%q x8664::rsp) (:%q temp)))
     
    558591  (cmpb (:$b x8664::fulltag-nil) (:%b arg0)))
    559592
     593(define-x8664-vinsn compare-to-t (()
     594                                    ((arg0 t)))
     595  (cmpq (:$l x8664::t-value) (:%q arg0)))
    560596
    561597(define-x8664-vinsn ref-constant (((dest :lisp))
    562598                                  ((lab :label)))
    563599  (movq (:@ (:^ lab) (:%q x8664::fn)) (:%q dest)))
     600
     601(define-x8664-vinsn compare-constant-to-register (()
     602                                                  ((lab :label)
     603                                                   (reg :lisp)))
     604  (cmpq (:@ (:^ lab) (:%q x8664::fn)) (:%q reg)))
     605
    564606
    565607(define-x8664-vinsn (vpush-constant :push :node :vsp) (()
     
    687729                                           
    688730
    689 (define-x8664-vinsn trap-unless-typecode= (()
     731(define-x8664-vinsn trap-unless-subtag= (()
    690732                                           ((object :lisp)
    691733                                            (tagval :u16const))
     
    695737  (andl (:$b x8664::tagmask) (:%l tag))
    696738  (cmpl (:$b x8664::tag-misc) (:%l tag))
    697   (jne :have-tag)
    698   ;; This needs to be a sign-extending mov, since the cmpl below
    699   ;; will sign-extend the 8-bit constant operand.
    700   (movsbl (:@ x8664::misc-subtag-offset (:%q object)) (:%l tag))
    701   :have-tag
    702   (cmpl (:$b tagval) (:%l tag))
     739  (jne :bad)
     740  (cmpb (:$b tagval) (:@ x8664::misc-subtag-offset (:%q object)))
    703741  (jne :bad)
    704742  (:anchored-uuo-section :resume)
     
    749787  (shlq (:$ub x8664::fixnumshift) (:%q temp))
    750788  (rcmpq (:%q idx) (:%q temp))
    751   (jge :bad)
     789  (jae :bad)
    752790
    753791  (:anchored-uuo-section :resume)
     
    9691007  (sarq (:$ub (- x8664::nbits-in-word (+ 16 x8664::fixnumshift))) (:%q dest))
    9701008  (cmpq (:%q src) (:%q dest))
    971   (je :bad)
     1009  (jne :bad)
    9721010  (testb (:$b x8664::fixnummask) (:%b dest))
    9731011  (jne :bad)
     
    11911229     ((header (:u64 #.x8664::imm0))
    11921230      (scaled-size (:u64 #.x8664::imm1))))
    1193   (jno.pt no-overflow)
     1231  (jno no-overflow)
    11941232  (movq (:%q val) (:%q scaled-size))
    11951233  (sarq (:$ub x8664::fixnumshift) (:%q scaled-size))
     
    13911429(define-x8664-vinsn (push-argregs :push :node :vsp) (()
    13921430                                                      ())
    1393   (testw (:%w x8664::nargs) (:%w x8664::nargs))
     1431  (testl (:%l x8664::nargs) (:%l x8664::nargs))
    13941432  (jz :done)
    1395   (rcmpw (:%w x8664::nargs) (:$w (* 2 x8664::node-size)))
     1433  (rcmpl (:%l x8664::nargs) (:$b (* 2 x8664::node-size)))
    13961434  (jb :one)
    13971435  (je :two)
     
    14061444                                                         ((max :u32const)))
    14071445  ((:pred >= max 3)
    1408    (testw (:%w x8664::nargs) (:%w x8664::nargs))
     1446   (testl (:%l x8664::nargs) (:%l x8664::nargs))
    14091447   (jz :done)
    1410    (rcmpw (:%w x8664::nargs) (:$w (* 2 x8664::node-size)))
     1448   (rcmpl (:%l x8664::nargs) (:$b (* 2 x8664::node-size)))
    14111449   (jb :one)
    14121450   (je :two)
     
    14181456   :done)
    14191457  ((:pred = max 2)
    1420    (rcmpw (:%w x8664::nargs) (:$w (* 1 x8664::node-size)))
     1458   (rcmpl (:%l x8664::nargs) (:$b (* 1 x8664::node-size)))
    14211459   (jb :done)
    14221460   (je :one)
     
    14261464   :done)
    14271465  ((:pred = max 1)
    1428    (testw (:%w x8664::nargs) (:%w x8664::nargs))
     1466   (testl (:%l x8664::nargs) (:%l x8664::nargs))
    14291467   (je :done)
    14301468   (pushq (:%q x8664::arg_z))
     
    16411679                             ((imm :u16)))
    16421680  ((:pred = n 0)
    1643    (xorq (:%q imm) (:%q imm)))
     1681   (xorl (:%l imm) (:%l imm)))
    16441682  ((:not (:pred = n 0))
    1645    (movw (:$w (:apply ash n x8664::fixnumshift)) (:%w imm)))
    1646   (subw (:%w x8664::nargs) (:%w imm))
     1683   (movl (:$l (:apply ash n x8664::fixnumshift)) (:%l imm)))
     1684  (subl (:%l x8664::nargs) (:%l imm))
    16471685  (jae :push-more)
    1648   (movswq (:%w imm) (:%q imm))
     1686  (movslq (:%l imm) (:%q imm))
    16491687  (subq (:%q imm) (:%q x8664::rsp))
    16501688  (jmp :done)
    16511689  :push-loop
    16521690  (pushq (:$l x8664::nil-value))
    1653   (addw (:$b x8664::node-size) (:%w x8664::nargs))
    1654   (subw (:$b x8664::node-size) (:%w imm))
     1691  (addl (:$b x8664::node-size) (:%l x8664::nargs))
     1692  (subl (:$b x8664::node-size) (:%l imm))
    16551693  :push-more
    16561694  (jne :push-loop)
     
    18571895  (movq (:$l 0) (:@ x8664::interrupt-level-binding-index (:%q temp)))
    18581896  (movq (:%q x8664::rsp) (:@ (:%seg :rcontext) x8664::tcr.db-link))
    1859   (jns.pt :done)
     1897  (jns :done)
    18601898  (btrq (:$ub 63) (:@ (:%seg :rcontext) x8664::tcr.interrupt-pending))
    1861   (jae.pt :done)
     1899  (jae :done)
    18621900  (ud2a)
    18631901  (:byte 2)
     
    18961934  (movq (:%q oldval) (:@ x8664::interrupt-level-binding-index (:%q tlb)))
    18971935  (movq (:%q link) (:@ (:%seg :rcontext) x8664::tcr.db-link))
    1898   (jns.pt :done)
     1936  (jns :done)
    18991937  (testq (:%q oldval) (:%q oldval))
    1900   (js.pt :done)
     1938  (js :done)
    19011939  (btrq (:$ub 63) (:@ (:%seg :rcontext) x8664::tcr.interrupt-pending))
    1902   (jae.pt :done)
     1940  (jae :done)
    19031941  (ud2a)
    19041942  (:byte 2)
     
    21052143  (movl (:%l bitnum) (:%l dest)))
    21062144
    2107 
    21082145(define-x8664-vinsn nref-bit-vector-fixnum (((dest :imm)
    21092146                                             (bitnum :s64))
     
    21142151  (setc (:%b bitnum))
    21152152  (movzbl (:%b bitnum) (:%l bitnum))
    2116   (imull (:$b x8664::fixnumone) (:%l bitnum) (:%l dest)))                                     
     2153  (imull (:$b x8664::fixnumone) (:%l bitnum) (:%l dest)))
     2154
    21172155
    21182156(define-x8664-vinsn nref-bit-vector-flags (()
     
    21282166  (btq (:$ub (:apply logand 63 idx))
    21292167       (:@ (:apply + x8664::misc-data-offset (:apply ash (:apply ash idx -6) x8664::word-shift)) (:%q src)))
    2130   (setb (:%b temp))
    2131   (negb (:%b temp))
    2132   (andl (:$l x8664::fixnumone) (:%l temp))
    2133   (movl (:%l temp) (:%l dest)))
     2168  (setc (:%b temp))
     2169  (movzbl (:%b temp) (:%l temp))
     2170  (imull (:$b x8664::fixnumone) (:%l temp) (:%l dest)))
     2171
    21342172
    21352173(define-x8664-vinsn misc-ref-c-bit-flags (()
     
    26232661  (movq (:%q count) (:%q temp))
    26242662  (sarq (:$ub x8664::fixnumshift) (:%q temp))
    2625   (rcmpq (:%q temp) (:$l 63))
    2626   (cmovbw (:%w temp) (:%w shiftcount))
     2663  (rcmpq (:%q temp) (:$l (- 63 x8664::fixnumshift)))
     2664  (cmovbl (:%l temp) (:%l shiftcount))
    26272665  (movq (:%q src) (:%q temp))
    26282666  (jae :shift-max)
     2667  (addl (:$b x8664::fixnumshift) (:%l shiftcount))
    26292668  (sarq (:%shift x8664::cl) (:%q temp))
    26302669  (jmp :done)
     
    26322671  (sarq (:$ub 63) (:%q temp))
    26332672  :done
    2634   (andb (:$b (lognot x8664::fixnummask)) (:%b temp))
    2635   (movq (:%q temp) (:%q dest)))
     2673  (imulq (:$b x8664::fixnumone) (:%q temp) (:%q dest)))
    26362674
    26372675(define-x8664-vinsn %ilsr (((dest :imm))
     
    26422680  (movq (:%q count) (:%q temp))
    26432681  (sarq (:$ub x8664::fixnumshift) (:%q temp))
    2644   (rcmpq (:%q temp) (:$l 63))
    2645   (cmovbw (:%w temp) (:%w shiftcount))
     2682  (rcmpq (:%q temp) (:$l (- 63 x8664::fixnumshift)))
     2683  (cmovbl (:%l temp) (:%l shiftcount))
    26462684  (movq (:%q src) (:%q temp))
    26472685  (jae :shift-max)
     2686  (addl (:$b x8664::fixnumshift) (:%l shiftcount))
    26482687  (shrq (:%shift x8664::cl) (:%q temp))
    26492688  (jmp :done)
     
    26512690  (shrq (:$ub 63) (:%q temp))
    26522691  :done
    2653   (andb (:$b (lognot x8664::fixnummask)) (:%b temp))
    2654   (movq (:%q temp) (:%q dest)))
     2692  (imulq (:$b x8664::fixnumone) (:%q temp) (:%q dest)))
    26552693
    26562694(define-x8664-vinsn %iasr-c (((dest :imm))
     
    26592697                             ((temp :s64)))
    26602698  (movq (:%q src) (:%q temp))
    2661   (sarq (:$ub count) (:%q temp))
    2662   (andb (:$b (lognot x8664::fixnummask)) (:%b temp))
    2663   (movq (:%q temp) (:%q dest)))
     2699  (sarq (:$ub (:apply + count x8664::fixnumshift)) (:%q temp))
     2700  (imulq (:$b x8664::fixnumone) (:%q temp) (:%q dest)))
    26642701
    26652702(define-x8664-vinsn %ilsr-c (((dest :imm))
     
    26682705                             ((temp :s64)))
    26692706  (movq (:%q src) (:%q temp))
    2670   (shrq (:$ub count) (:%q temp))
    2671   (andb (:$b (lognot x8664::fixnummask)) (:%b temp))
    2672   (movq (:%q temp) (:%q dest)))
     2707  (shrq (:$ub (:apply + count x8664::fixnumshift)) (:%q temp))
     2708  (imulq (:$b x8664::fixnumone) (:%q temp) (:%q dest)))
    26732709
    26742710(define-x8664-vinsn %ilsl (((dest :imm))
     
    27922828  (movl (:%l object) (:%l tag))
    27932829  (andl (:$b x8664::fixnummask) (:%l tag))
    2794   (je.pt :got-it)
     2830  (je :got-it)
    27952831  (cmpl (:$b x8664::tag-misc) (:%l tag))
    27962832  (jne :bad)
     
    30073043  (testl (:$l x8664::fixnummask) (:%l object))
    30083044  (movl (:%l object) (:%l tag))
    3009   (je.pt :ok)
     3045  (je :ok)
    30103046  (andl (:$b x8664::fulltagmask) (:%l tag))
    30113047  (cmpl (:$b x8664::fulltag-misc) (:%l tag))
     
    30243060  (testl (:$l x8664::fixnummask) (:%l object))
    30253061  (movq (:%q object) (:%q tag))
    3026   (je.pt :ok-if-non-negative)
     3062  (je :ok-if-non-negative)
    30273063  (andl (:$b x8664::fulltagmask) (:%l tag))
    30283064  (cmpl (:$b x8664::fulltag-misc) (:%l tag))
     
    30313067  (je :two)
    30323068  (cmpq (:$l x8664::three-digit-bignum-header) (:@ x8664::misc-header-offset (:%q object)))
    3033   (jne.pn :bad)
     3069  (jne :bad)
    30343070  (cmpl (:$b 0) (:@ (+ x8664::misc-data-offset 8) (:%q object)))
    30353071  (je :ok)
     
    31883224                                 ((nfixed :s16const)))
    31893225  ((:pred > nfixed 0)
    3190    (addw (:$w (:apply - (:apply ash nfixed x8664::word-shift))) (:%w x8664::nargs))))
     3226   ((:pred < nfixed 16)
     3227    (subl (:$b (:apply ash nfixed x8664::word-shift)) (:%l x8664::nargs)))
     3228   ((:pred >= nfixed 16)
     3229    (subl (:$l (:apply ash nfixed x8664::word-shift)) (:%l x8664::nargs)))))
    31913230
    31923231(define-x8664-vinsn opt-supplied-p (()
    3193                                     ())
    3194   (xorl (:%l x8664::imm1) (:%l x8664::imm1))
    3195   (movl (:$l x8664::t-value) (:%l x8664::arg_y))
     3232                                    ((num-opt :u16const))
     3233                                    ((nargs (:u64 #.x8664::nargs))
     3234                                     (imm :imm)))
     3235  (nop)
     3236  (xorl (:%l imm) (:%l imm))
     3237  (movl (:$l x8664::nil-value) (:%l x8664::arg_y))
    31963238  :loop
    3197   (rcmpw (:%w x8664::imm1) (:%w x8664::nargs))
    3198   (movl (:$l x8664::nil-value) (:%l x8664::arg_z))
    3199   (cmovll (:%l x8664::arg_y) (:%l  x8664::arg_z))
    3200   (addl (:$b x8664::node-size) (:%l x8664::imm1))
    3201   (cmpl (:%l x8664::imm1) (:%l x8664::imm0))
     3239  (rcmpl (:%l imm) (:%l nargs))
     3240  (movl (:%l x8664::arg_y) (:%l x8664::arg_z))
     3241  (cmovll (:@ x8664::t-offset (:%l x8664::arg_y)) (:%l  x8664::arg_z))
     3242  (addl (:$b x8664::node-size) (:%l imm))
     3243  (rcmpl (:%l imm) (:$l (:apply ash num-opt x8664::fixnumshift)))
    32023244  (pushq (:%q x8664::arg_z))
    32033245  (jne :loop))
     
    32063248                                        ()
    32073249                                        ((temp :u64)))
    3208   (testw (:%w x8664::nargs) (:%w x8664::nargs))
    3209   (setne (:%b temp))
    3210   (negb (:%b temp))
    3211   (andl (:$b x8664::t-offset) (:%l temp))
    3212   (addl (:$l x8664::nil-value) (:%l temp))
     3250  (testl (:%l x8664::nargs) (:%l x8664::nargs))
     3251  (movl (:$l x8664::nil-value) (:%l temp))
     3252  (cmovnel (:@ x8664::t-offset (:%l temp)) (:%l temp))
    32133253  (pushq (:%q temp)))
    32143254
     
    32173257                                        ((temp0 :u64)
    32183258                                         (temp1 :u64)))
    3219   (rcmpw (:%w x8664::nargs) (:$w x8664::node-size))
    3220   (setae (:%b temp0))
    3221   (seta (:%b temp1))
    3222   (negb (:%b temp0))
    3223   (negb (:%b temp1))
    3224   (andl (:$b x8664::t-offset) (:%l temp0))
    3225   (andl (:$b x8664::t-offset) (:%l temp1))
    3226   (addl (:$l x8664::nil-value) (:%l temp0))
    3227   (addl (:$l x8664::nil-value) (:%l temp1))
     3259  (rcmpl (:%l x8664::nargs) (:$b x8664::node-size))
     3260  (movl (:$l x8664::nil-value) (:%l temp0))
     3261  (movl (:%l temp0) (:%l temp1))
     3262  (cmovael (:@ x8664::t-offset (:%l temp0)) (:%l temp0))
     3263  (cmoval (:@ x8664::t-offset (:%l temp1)) (:%l temp1))
    32283264  (pushq (:%q temp0))
    32293265  (pushq (:%q temp1)))
     
    32943330   (pushq (:%q x8664::arg_z)))
    32953331  ((:pred = min-fixed 2)                ; at least 2 args
    3296    (cmpw (:$w (ash 2 x8664::word-shift)) (:%w x8664::nargs))
     3332   (cmpl (:$b (ash 2 x8664::word-shift)) (:%l x8664::nargs))
    32973333   (je :yz2)                      ; skip arg_x if exactly 2
    32983334   (pushq (:%q x8664::arg_x))
     
    33013337   (pushq (:%q x8664::arg_z)))
    33023338  ((:pred = min-fixed 1)                ; at least one arg
    3303    (rcmpw (:%w x8664::nargs) (:$w  (ash 2 x8664::word-shift)))
     3339   (rcmpl (:%l x8664::nargs) (:$b  (ash 2 x8664::word-shift)))
    33043340   (jl :z1)                       ; branch if exactly one
    33053341   (je :yz1)                      ; branch if exactly two
     
    33103346   (pushq (:%q x8664::arg_z)))
    33113347  ((:pred = min-fixed 0)
    3312    (testw (:%w x8664::nargs) (:%w x8664::nargs))
     3348   (testl (:%l x8664::nargs) (:%l x8664::nargs))
    33133349   (je  :none)                     ; exactly zero
    3314    (rcmpw (:%w x8664::nargs) (:$w (ash 2 x8664::word-shift)))
     3350   (rcmpl (:%l x8664::nargs) (:$b (ash 2 x8664::word-shift)))
    33153351   (je :yz0)                      ; exactly two
    33163352   (jl :z0)                       ; one
     
    33233359   :none
    33243360   )
    3325   (movzwl (:%w x8664::nargs) (:%l x8664::nargs))
    33263361  ((:not (:pred = min-fixed 0))
    33273362   (leaq (:@ (:apply - (:apply ash min-fixed x8664::word-shift)) (:%q x8664::nargs))
     
    35753610                                  ((temp :u32)))
    35763611  (movl (:%l src) (:%l temp))
    3577   (sarl (:$ub (+ x8664::fixnumshift 11)) (:%l temp))
     3612  (sarl (:$ub (+ x8664::fixnumshift 1)) (:%l temp))
     3613  (cmpl (:$l (ash #xfffe -1)) (:%l temp))
     3614  (je :bad-if-eq)
     3615  (sarl (:$ub (- 11 1)) (:%l temp))
    35783616  (cmpl (:$b (ash #xd800 -11))(:%l temp))
     3617  :bad-if-eq
    35793618  (movl (:$l x8664::nil-value) (:%l temp))
    35803619  (cmovel (:%l temp) (:%l dest))
     
    36303669                               ()
    36313670                               ((imm0 :u64)))
    3632   (movzwl (:%w x8664::nargs) (:%l x8664::nargs))
    36333671  (leaq (:@ (:%q x8664::rsp) (:%q x8664::nargs)) (:%q imm0))
    36343672  (subq (:@ (:%q imm0)) (:%q x8664::nargs))
     
    38563894(define-x8664-vinsn pop-argument-registers (()
    38573895                                            ())
    3858   (testw (:%w x8664::nargs) (:%w x8664::nargs))
     3896  (testl (:%l x8664::nargs) (:%l x8664::nargs))
    38593897  (je :done)
    3860   (rcmpw (:%w x8664::nargs) (:$w (ash 2 x8664::word-shift)))
     3898  (rcmpl (:%l x8664::nargs) (:$b (ash 2 x8664::word-shift)))
    38613899  (popq (:%q x8664::arg_z))
    38623900  (jb :done)
  • branches/working-0711-perf/ccl/compiler/X86/x862.lisp

    r9495 r9710  
    17231723        (when safe
    17241724          (if (typep safe 'fixnum)
    1725             (! trap-unless-typecode= src safe))
     1725            (! trap-unless-subtag= src safe))
    17261726          (unless index-known-fixnum
    17271727            (! trap-unless-fixnum unscaled-idx))
     
    19901990          (with-imm-temps (target) ()   ; Don't use target in type/bounds check
    19911991            (if (typep safe 'fixnum)
    1992               (! trap-unless-typecode= src safe))
     1992              (! trap-unless-subtag= src safe))
    19931993            (unless index-known-fixnum
    19941994              (! trap-unless-fixnum unscaled-idx))
     
    24382438              (setq *available-backend-imm-temps* (bitclr value *available-backend-imm-temps*)))
    24392439            (if (typep safe 'fixnum)
    2440               (! trap-unless-typecode= src safe))
     2440              (! trap-unless-subtag= src safe))
    24412441            (unless index-known-fixnum
    24422442              (! trap-unless-fixnum unscaled-idx))
     
    34183418                   (setq src (x862-one-untargeted-reg-form seg vector x8664::arg_z)))
    34193419                 (when safe
    3420                    (! trap-unless-typecode= src (nx-lookup-target-uvector-subtag :bit-vector))
     3420                   (! trap-unless-subtag= src (nx-lookup-target-uvector-subtag :bit-vector))
    34213421                   (unless index-known-fixnum
    34223422                     (! trap-unless-fixnum unscaled-idx))
     
    35573557           (^))))
    35583558      (^))))
     3559
     3560(defun x862-compare-register-to-constant (seg vreg xfer ireg cr-bit true-p constant)
     3561  (cond ((eq constant *nx-nil*)
     3562         (x862-compare-register-to-nil seg vreg xfer ireg cr-bit true-p))
     3563        (t
     3564         (with-x86-local-vinsn-macros (seg vreg xfer)
     3565           (when vreg
     3566             (if (eq constant *nx-t*)
     3567               (! compare-to-t ireg)
     3568               (let* ((imm (x862-immediate-operand constant))
     3569                      (reg (x862-register-constant-p imm)))
     3570                 (if reg
     3571                   (! compare-registers reg ireg)
     3572                   (! compare-constant-to-register (x86-immediate-label imm) ireg))))
     3573             (regspec-crf-gpr-case
     3574              (vreg dest)
     3575              (^ cr-bit true-p)
     3576              (progn
     3577                (ensuring-node-target (target dest)
     3578                  (if (not true-p)
     3579                    (setq cr-bit (logxor 1 cr-bit)))
     3580                  (! cr-bit->boolean target cr-bit))
     3581                (^))))))))
    35593582
    35603583(defun x862-compare-register-to-nil (seg vreg xfer ireg cr-bit true-p)
     
    51385161        (let* ((num-temp-frames 0)
    51395162               (num-c-frames 0))
    5140           (declare (fixnum numnlispareas num-c-frames))
     5163          (declare (fixnum num-temp-frames num-c-frames))
    51415164          (flet ((pop-temp-frames ()
    51425165                   (dotimes (i num-temp-frames)
     
    57065729           (reserved-lcells nil)
    57075730           (*x862-vstack* 0))
    5708       (declare (type (unsigned-byte 16) num-req num-opt num-inh reqvloc))
     5731      (declare (type (unsigned-byte 16) num-req num-opt num-inh))
    57095732      (with-x86-p2-declarations p2decls
    57105733        (setq *x862-inhibit-register-allocation*
     
    58045827                (when hardopt
    58055828                  (x862-reserve-vstack-lcells num-opt)
    5806                   (x862-lri seg x8664::imm0 (ash num-opt *x862-target-fixnum-shift*))
    58075829
    58085830                  ;; ! opt-supplied-p wants nargs to contain the
     
    58165838                        ((= 2 num-opt)
    58175839                         (! two-opt-supplied-p))
    5818                         (t (! opt-supplied-p))))
     5840                        (t (! opt-supplied-p num-opt))))
    58195841                (let* ((nwords-vpushed (+ num-fixed
    58205842                                          num-opt
     
    63686390(defx862 x862-%valid-code-char %valid-code-char (seg vreg xfer c)
    63696391  (let* ((reg (x862-one-untargeted-reg-form seg c x8664::arg_z)))
    6370     ;; Typecheck even if result unused.
    6371     (unless *x862-reckless* (! require-char-code reg))
     6392    (when *x862-full-safety* (! require-char-code reg))
    63726393    (if vreg
    63736394      (ensuring-node-target (target vreg)
     
    63756396    (^)))
    63766397
     6398(defun x862-eq-test (seg vreg xfer cc form1 form2)
     6399  (with-x86-local-vinsn-macros (seg)
     6400    (multiple-value-bind (cr-bit true-p) (acode-condition-to-x86-cr-bit cc)
     6401      (let* ((f1 (acode-unwrapped-form form1))
     6402             (f2 (acode-unwrapped-form form2)))
     6403        (cond ((or (eq f1 *nx-nil*)
     6404                   (eq f1 *nx-t*)
     6405                   (and (acode-p f1)
     6406                        (eq (acode-operator f1) (%nx1-operator immediate))))
     6407               (x862-compare-register-to-constant seg vreg xfer (x862-one-untargeted-reg-form seg form2 ($ x8664::arg_z)) cr-bit true-p f1))
     6408              ((or (eq f2 *nx-nil*)
     6409                   (eq f2 *nx-t*)
     6410                   (and (acode-p f2)
     6411                        (eq (acode-operator f2) (%nx1-operator immediate))))
     6412               (x862-compare-register-to-constant seg vreg xfer
     6413                                                  (x862-one-untargeted-reg-form seg form1 ($ x8664::arg_z))
     6414                                                  cr-bit true-p f2))
     6415              (t (x862-compare seg vreg xfer form1 form2 cr-bit true-p)))))))
     6416
    63776417(defx862 x862-eq eq (seg vreg xfer cc form1 form2)
    6378   (multiple-value-bind (cr-bit true-p) (acode-condition-to-x86-cr-bit cc)
    6379     (x862-compare seg vreg xfer form1 form2 cr-bit true-p)))
     6418  (x862-eq-test seg vreg xfer cc form1 form2))
    63806419
    63816420(defx862 x862-neq neq (seg vreg xfer cc form1 form2)
    6382   (multiple-value-bind (cr-bit true-p) (acode-condition-to-x86-cr-bit cc)
    6383     (x862-compare seg vreg xfer form1 form2 cr-bit true-p)))
     6421  (x862-eq-test seg vreg xfer cc form1 form2))
    63846422
    63856423(defx862 x862-numcmp numcmp (seg vreg xfer cc form1 form2)
     
    67836821           (*x862-top-vstack-lcell* *x862-top-vstack-lcell*)
    67846822           (nargs (x862-formlist seg (car arglist) (cadr arglist))))
    6785       (declare (fixnum args))
     6823      (declare (fixnum nargs))
    67866824      (when (> nargs 1)
    67876825        (x862-set-nargs seg (1- nargs))
     
    86818719         (ngpr-args 0)
    86828720         (simple-foreign-args nil))
    8683       (declare (fixnum   ngpr-args narg-words
     8721      (declare (fixnum  ngpr-args nother-words
    86848722                        gpr-offset other-offset))
    86858723      (dolist (argspec argspecs)
     
    87818819         (fp-loads ())
    87828820         (return-registers ()))
    8783       (declare (fixnum  nshort-floats ndouble-floats nfpr-args ngpr-args narg-words
     8821      (declare (fixnum  nsingle-floats ndouble-floats nfpr-args ngpr-args nother-words
    87848822                        gpr-offset other-offset single-float-offset double-float-offset))
    87858823      (dolist (argspec argspecs)
Note: See TracChangeset for help on using the changeset viewer.