Changeset 7817


Ignore:
Timestamp:
Dec 4, 2007, 10:06:53 PM (13 years ago)
Author:
rme
Message:

Some more vinsns (including store-single, for the benefit of
x862-%setf-single-float).

File:
1 edited

Legend:

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

    r7772 r7817  
    412412(define-x8632-vinsn (lri :constant-ref) (((dest :imm))
    413413                                         ((intval :s32const))
     414                                         ())
     415  ((:pred = intval 0)
     416   (xorl (:%l dest) (:%l dest)))
     417  ((:not (:pred = intval 0))
     418   (movl (:$l intval) (:%l dest))))
     419
     420(define-x8632-vinsn (lriu :constant-ref) (((dest :imm))
     421                                         ((intval :u32const))
    414422                                         ())
    415423  ((:pred = intval 0)
     
    18101818  (movzwl (:@ (:%l src) (:%l index)) (:%l dest)))
    18111819
     1820(define-x8632-vinsn mem-ref-c-s16 (((dest :s16))
     1821                                   ((src :address)
     1822                                    (index :s32const)))
     1823  ((:pred = index 0)
     1824   (movswl (:@ (:%l src)) (:%l dest)))
     1825  ((:not (:pred = index 0))
     1826   (movswl (:@ index (:%l src)) (:%l dest))))
     1827
     1828(define-x8632-vinsn mem-ref-s16 (((dest :s16))
     1829                                 ((src :address)
     1830                                  (index :s32)))
     1831  (movswl (:@ (:%l src) (:%l index)) (:%l dest)))
     1832
    18121833(define-x8632-vinsn mem-ref-c-u8 (((dest :u8))
    18131834                                  ((src :address)
     
    19211942                                   ())
    19221943  (movl (:%l val) (:@ x8632::misc-data-offset (:%l v) (:%l scaled-idx))))
     1944
     1945(define-x8632-vinsn %iasr (((dest :imm))
     1946                           ((count :imm)
     1947                            (src :imm))
     1948                           ((temp :s32)
     1949                            (shiftcount (:s32 #.x8664::rcx))))
     1950  (movl (:%l count) (:%l temp))
     1951  (sarl (:$ub x8632::fixnumshift) (:%l temp))
     1952  (rcmpl (:%l temp) (:$l 31))
     1953  (cmovbw (:%w temp) (:%w shiftcount))
     1954  (movl (:%l src) (:%l temp))
     1955  (jae :shift-max)
     1956  (sarl (:%shift x8632::cl) (:%l temp))
     1957  (jmp :done)
     1958  :shift-max
     1959  (sarl (:$ub 31) (:%l temp))
     1960  :done
     1961  (andl (:$l (lognot x8632::fixnummask)) (:%l temp))
     1962  (movl (:%l temp) (:%l dest)))
    19231963
    19241964(define-x8632-vinsn %ilsr (((dest :imm))
     
    19862026   (movl (:%l src) (:%l dest)))
    19872027  (shll (:$ub count) (:%l dest)))
     2028
     2029;;; In safe code, something else has ensured that the value is of type
     2030;;; BIT.
     2031(define-x8632-vinsn set-variable-bit-to-variable-value (()
     2032                                                        ((vec :lisp)
     2033                                                         (word-index :s32)
     2034                                                         (bitnum :u8)
     2035                                                         (value :lisp)))
     2036  (testl (:%l value) (:%l value))
     2037  (je :clr)
     2038  (btsl (:%l bitnum) (:@ x8632::misc-data-offset (:%l vec) (:%l word-index) 4))
     2039  (jmp :done)
     2040  :clr
     2041  (btrl (:%l bitnum) (:@ x8632::misc-data-offset (:%l vec) (:%l word-index) 4))
     2042  :done)
     2043
     2044(define-x8632-vinsn set-variable-bit-to-zero (()
     2045                                              ((vec :lisp)
     2046                                               (word-index :s32)
     2047                                               (bitnum :u8)))
     2048  (btrl (:%l bitnum) (:@ x8632::misc-data-offset (:%l vec) (:%l word-index) 4)))
     2049
     2050(define-x8632-vinsn set-variable-bit-to-one (()
     2051                                             ((vec :lisp)
     2052                                              (word-index :s32)
     2053                                              (bitnum :u8)))
     2054  (btsl (:%l bitnum) (:@ x8632::misc-data-offset (:%l vec) (:%l word-index) 4)))
     2055
     2056(define-x8632-vinsn set-constant-bit-to-zero (()
     2057                                              ((src :lisp)
     2058                                               (idx :u32const)))
     2059  (btrl (:$ub (:apply logand 31 idx))
     2060        (:@ (:apply + x8632::misc-data-offset (:apply ash (:apply ash idx -5) x8632::word-shift)) (:%l src))))
     2061
     2062(define-x8632-vinsn set-constant-bit-to-one (()
     2063                                             ((src :lisp)
     2064                                              (idx :u32const)))
     2065  (btsl (:$ub (:apply logand 31 idx))
     2066        (:@ (:apply + x8632::misc-data-offset (:apply ash (:apply ash idx -5) x8632::word-shift)) (:%l src))))
     2067
     2068(define-x8632-vinsn set-constant-bit-to-variable-value (()
     2069                                                        ((src :lisp)
     2070                                                         (idx :u32const)
     2071                                                         (value :lisp)))
     2072  (testl (:%l value) (:%l value))
     2073  (je :clr)
     2074  (btsl (:$ub (:apply logand 31 idx))
     2075        (:@ (:apply + x8632::misc-data-offset (:apply ash (:apply ash idx -5) x8632::word-shift)) (:%l src)))
     2076  (jmp :done)
     2077  :clr
     2078  (btrl (:$ub (:apply logand 31 idx))
     2079        (:@ (:apply + x8632::misc-data-offset (:apply ash (:apply ash idx -5) x8632::word-shift)) (:%l src)))
     2080  :done)
    19882081
    19892082(define-x8632-vinsn require-fixnum (()
     
    22462339  :ok)
    22472340
     2341(define-x8632-vinsn require-s64 (()
     2342                                 ((object :lisp))
     2343                                 ((tag :s32)))
     2344  :again
     2345  (testl (:$l x8632::fixnummask) (:%l object))
     2346  (movl (:%l object) (:%l tag))
     2347  (je.pt :ok)
     2348  (andl (:$l x8632::fulltagmask) (:%l tag))
     2349  (cmpl (:$l x8632::fulltag-misc) (:%l tag))
     2350  (jne.pn :bad)
     2351  (cmpl (:$l x8632::two-digit-bignum-header) (:@ x8632::misc-header-offset (:%l object)))
     2352  (jne.pt :ok)
     2353  :bad
     2354  (uuo-error-reg-not-type (:%l object) (:$ub arch::error-object-not-signed-byte-64))
     2355  (jmp :again)
     2356  :ok)
     2357
     2358(define-x8632-vinsn require-u64 (()
     2359                                 ((object :lisp))
     2360                                 ((tag :s32)))
     2361  :again
     2362  (testl (:$l x8632::fixnummask) (:%l object))
     2363  (movl (:%l object) (:%l tag))
     2364  (je.pt :ok-if-non-negative)
     2365  (andl (:$l x8632::fulltagmask) (:%l tag))
     2366  (cmpl (:$l x8632::fulltag-misc) (:%l tag))
     2367  (jne.pn :bad)
     2368  (cmpl (:$l x8632::two-digit-bignum-header) (:@ x8632::misc-header-offset (:%l object)))
     2369  (je :two)
     2370  (cmpl (:$l x8632::three-digit-bignum-header) (:@ x8632::misc-header-offset (:%l object)))
     2371  (jne.pn :bad)
     2372  (cmpl (:$b 0) (:@ (+ x8632::misc-data-offset 8) (:%l object)))
     2373  (je :ok)
     2374  :bad
     2375  (uuo-error-reg-not-type (:%l object) (:$ub arch::error-object-not-unsigned-byte-64))
     2376  (jmp :again)
     2377  :two
     2378  (movl (:@ x8632::misc-data-offset (:%l object)) (:%l tag))
     2379  :ok-if-non-negative
     2380  (testl (:%l tag) (:%l tag))
     2381  (js :bad)
     2382  :ok)
     2383
    22482384(define-x8632-vinsn require-char-code (()
    22492385                                       ((object :lisp))
     
    25132649
    25142650
    2515 ;; xxx
     2651(define-x8632-vinsn setup-single-float-allocation (()
     2652                                                   ())
     2653  (movl (:$l (arch::make-vheader x8632::single-float.element-count x8632::subtag-single-float)) (:%l x8632::imm0))
     2654  (movd (:%l x8632::imm0) (:%mmx x8632::mm0))
     2655  (movl (:$l (- x8632::single-float.size x8632::fulltag-misc)) (:%l x8632::imm0)))
     2656 
    25162657(define-x8632-vinsn setup-double-float-allocation (()
    25172658                                                   ())
    25182659  (movl (:$l (arch::make-vheader x8632::double-float.element-count x8632::subtag-double-float)) (:%l x8632::imm0))
    2519   (movl (:$l (- x8632::double-float.size x8632::fulltag-misc)) (:%l x8664::imm1.l)))
     2660  (movd (:%l x8632::imm0) (:%mmx x8632::mm0))
     2661  (movl (:$l (- x8632::double-float.size x8632::fulltag-misc)) (:%l x8632::imm0)))
     2662
     2663(define-x8632-vinsn set-single-float-value (()
     2664                                            ((node :lisp)
     2665                                             (val :single-float)))
     2666  (movss (:%xmm val) (:@ x8632::single-float.value (:%l node))))
    25202667
    25212668(define-x8632-vinsn set-double-float-value (()
     
    25232670                                             (val :double-float)))
    25242671  (movsd (:%xmm val) (:@ x8632::double-float.value (:%l node))))
     2672
     2673(define-x8632-vinsn word-index-and-bitnum-from-index (((word-index :u32)
     2674                                                       (bitnum :u8))
     2675                                                      ((index :imm)))
     2676  (movl (:%l index) (:%l word-index))
     2677  (shrl (:$ub x8632::fixnumshift) (:%l word-index))
     2678  (movl (:$l 31) (:%l bitnum))
     2679  (andl (:%l word-index) (:%l bitnum))
     2680  (shrl (:$ub 5) (:%l word-index)))
     2681
     2682(define-x8632-vinsn ref-bit-vector-fixnum (((dest :imm)
     2683                                            (bitnum :u8))
     2684                                           ((bitnum :u8)
     2685                                            (bitvector :lisp)
     2686                                            (word-index :u32)))
     2687  (btl (:%l bitnum) (:@ x8632::misc-data-offset (:%l bitvector) (:%l word-index) 4))
     2688  (setb (:%b bitnum))
     2689  (negb (:%b bitnum))
     2690  (andl (:$l x8632::fixnumone) (:%l bitnum))
     2691  (movl (:%l bitnum) (:%l dest)))
    25252692
    25262693(define-x8632-vinsn set-macptr-address (()
     
    25912758   (movl (:@ index (:%l src)) (:%l dest))))
    25922759
     2760(define-x8632-vinsn mem-ref-c-double-float (((dest :double-float))
     2761                                            ((src :address)
     2762                                             (index :s32const)))
     2763  ((:pred = index 0)
     2764   (movsd (:@ (:%l src)) (:%xmm dest)))
     2765  ((:not (:pred = index 0))
     2766   (movsd (:@ index (:%l src)) (:%xmm dest))))
     2767
     2768(define-x8632-vinsn mem-set-c-double-float (()
     2769                                            ((val :double-float)
     2770                                             (src :address)
     2771                                             (index :s32const)))
     2772  ((:pred = index 0)
     2773   (movsd (:%xmm val) (:@ (:%l src))))
     2774  ((:not (:pred = index 0))
     2775   (movsd (:%xmm val) (:@ index (:%l src)))))
    25932776
    25942777(define-x8632-vinsn mem-ref-fullword (((dest :u32))
     
    26402823  ((:not (:pred = offset 0))
    26412824   (movl (:%l val) (:@ offset (:%l dest)))))
     2825
     2826(define-x8632-vinsn mem-set-bit-variable-value (((src :address))
     2827                                                ((src :address)
     2828                                                 (offset :lisp)
     2829                                                 (value :lisp))
     2830                                                ((temp :u32)))
     2831  (movl (:%l offset) (:%l temp))
     2832  (shrl (:$ub (+ 5 x8632::fixnumshift)) (:%l temp))
     2833  (leal (:@ (:%l src) (:%l temp) 4) (:%l src))
     2834  (movl (:%l offset) (:%l temp))
     2835  (shrl (:$ub x8632::fixnumshift) (:%l temp))
     2836  (andl (:$l 31) (:%l temp))
     2837  (testl (:%l value) (:%l value))
     2838  (jne :set)
     2839  (btrl (:%l temp) (:@ (:%l src)))
     2840  (jmp :done)
     2841  :set
     2842  (btsl (:%l temp) (:@ (:%l src)))
     2843  :done)
    26422844
    26432845(define-x8632-vinsn %natural+  (((result :u32))
     
    29863188  (movl (:$self 0) (:%l x8632::fn)))
    29873189
     3190(define-x8632-vinsn %set-scharcode32 (()
     3191                                    ((str :lisp)
     3192                                     (idx :imm)
     3193                                     (code :imm))
     3194                                    ((imm :u32)
     3195                                     (imm1 :u32)))
     3196  (movl (:%l code) (:%l imm1))
     3197  (movl (:%l idx) (:%l imm))
     3198  (shrl (:$ub x8632::fixnumshift) (:%l imm1))
     3199  (shrl (:$ub 2) (:%l imm))
     3200  (movl (:%l imm1) (:@ x8632::misc-data-offset (:%l str) (:%l imm))))
     3201
     3202(define-x8632-vinsn pop-argument-registers (()
     3203                                            ())
     3204  (testw (:%w x8632::nargs) (:%w x8632::nargs))
     3205  (je :done)
     3206  (rcmpw (:%w x8632::nargs) (:$w (ash 1 x8632::word-shift)))
     3207  (popl (:%l x8632::arg_z))
     3208  (je :done)
     3209  (popl (:%l x8664::arg_y))
     3210  :done)
     3211
    29883212(define-x8632-vinsn %symptr->symvector (((target :lisp))
    29893213                                        ((target :lisp)))
     
    30963320
    30973321;;; "dest" is preallocated, presumably on a stack somewhere.
     3322(define-x8632-vinsn store-single (()
     3323                                  ((dest :lisp)
     3324                                   (source :single-float))
     3325                                  ())
     3326  (movss (:%xmm source) (:@  x8632::single-float.value (:%l dest))))
     3327
     3328;;; "dest" is preallocated, presumably on a stack somewhere.
    30983329(define-x8632-vinsn store-double (()
    30993330                                  ((dest :lisp)
     
    32353466                    (:apply ash cellno 2))
    32363467              (:%l src)) (:%l dest)))
     3468
     3469(define-x8632-vinsn mem-ref-bit-fixnum (((dest :lisp)
     3470                                         (src :address))
     3471                                        ((src :address)
     3472                                         (offset :lisp))
     3473                                        ((temp :u32)))
     3474  (movl (:%l offset) (:%l temp))
     3475  (shrl (:$ub (+ 5 x8632::fixnumshift)) (:%l temp))
     3476  (leal (:@ (:%l src) (:%l temp) 4) (:%l src))
     3477  (movl (:%l offset) (:%l temp))
     3478  (shrl (:$ub x8632::fixnumshift) (:%l temp))
     3479  (andl (:$l 31) (:%l temp))
     3480  (btl (:%l temp) (:@ (:%l src)))
     3481  (movl (:$l x8632::fixnumone) (:%l temp))
     3482  (leal (:@ (- x8632::fixnumone) (:%l temp)) (:%l dest))
     3483  (cmovbl (:%l temp) (:%l dest)))
    32373484
    32383485(define-x8632-subprim-call-vinsn (progvsave) .SPprogvsave)
     
    33703617  (addl (:$b 8) (:@ (:%seg :rcontext) x8632::tcr.foreign-sp)))
    33713618
     3619(define-x8632-vinsn (temp-push-node :push :word :tsp)
     3620    (()
     3621     ((w :lisp))
     3622     ((temp :imm)))
     3623  (subl (:$b (* 2 x8632::dnode-size)) (:@ (:%seg :rcontext) x8632::tcr.next-tsp))
     3624  (movd (:@ (:%seg :rcontext) x8632::tcr.save-tsp) (:%mmx x8632::stack-temp))
     3625  (movl (:@ (:%seg :rcontext) x8632::tcr.next-tsp) (:%l temp))
     3626  (movapd (:%xmm x8632::fpzero) (:@ (:%l temp)))
     3627  (movd (:%mmx x8632::stack-temp) (:@ (:%l temp)))
     3628  (movl (:%l temp) (:@ (:%seg :rcontext) x8632::tcr.save-tsp))
     3629  (movl (:%l w) (:@ x8632::dnode-size (:%l temp))))
     3630
     3631(define-x8632-vinsn (temp-pop-node :pop :word :tsp)
     3632    (((w :lisp))
     3633     ()
     3634     ((temp :imm)))
     3635  (movl (:@ (:%seg :rcontext) x8632::tcr.save-tsp) (:%l temp))
     3636  (movl (:@ x8632::dnode-size (:%l temp)) (:%l w))
     3637  (movl (:@ (:%l temp)) (:%l temp))
     3638  (movl (:%l temp) (:@ (:%seg :rcontext) x8632::tcr.save-tsp)) 
     3639  (movl (:%l temp) (:@ (:%seg :rcontext) x8632::tcr.next-tsp)))
     3640
    33723641(queue-fixup
    33733642 (fixup-x86-vinsn-templates
Note: See TracChangeset for help on using the changeset viewer.