- Timestamp:
- Dec 4, 2007, 2:06:53 PM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/ia32/compiler/X86/X8632/x8632-vinsns.lisp
r7772 r7817 412 412 (define-x8632-vinsn (lri :constant-ref) (((dest :imm)) 413 413 ((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)) 414 422 ()) 415 423 ((:pred = intval 0) … … 1810 1818 (movzwl (:@ (:%l src) (:%l index)) (:%l dest))) 1811 1819 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 1812 1833 (define-x8632-vinsn mem-ref-c-u8 (((dest :u8)) 1813 1834 ((src :address) … … 1921 1942 ()) 1922 1943 (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))) 1923 1963 1924 1964 (define-x8632-vinsn %ilsr (((dest :imm)) … … 1986 2026 (movl (:%l src) (:%l dest))) 1987 2027 (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) 1988 2081 1989 2082 (define-x8632-vinsn require-fixnum (() … … 2246 2339 :ok) 2247 2340 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 2248 2384 (define-x8632-vinsn require-char-code (() 2249 2385 ((object :lisp)) … … 2513 2649 2514 2650 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 2516 2657 (define-x8632-vinsn setup-double-float-allocation (() 2517 2658 ()) 2518 2659 (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)))) 2520 2667 2521 2668 (define-x8632-vinsn set-double-float-value (() … … 2523 2670 (val :double-float))) 2524 2671 (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))) 2525 2692 2526 2693 (define-x8632-vinsn set-macptr-address (() … … 2591 2758 (movl (:@ index (:%l src)) (:%l dest)))) 2592 2759 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))))) 2593 2776 2594 2777 (define-x8632-vinsn mem-ref-fullword (((dest :u32)) … … 2640 2823 ((:not (:pred = offset 0)) 2641 2824 (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) 2642 2844 2643 2845 (define-x8632-vinsn %natural+ (((result :u32)) … … 2986 3188 (movl (:$self 0) (:%l x8632::fn))) 2987 3189 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 2988 3212 (define-x8632-vinsn %symptr->symvector (((target :lisp)) 2989 3213 ((target :lisp))) … … 3096 3320 3097 3321 ;;; "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. 3098 3329 (define-x8632-vinsn store-double (() 3099 3330 ((dest :lisp) … … 3235 3466 (:apply ash cellno 2)) 3236 3467 (:%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))) 3237 3484 3238 3485 (define-x8632-subprim-call-vinsn (progvsave) .SPprogvsave) … … 3370 3617 (addl (:$b 8) (:@ (:%seg :rcontext) x8632::tcr.foreign-sp))) 3371 3618 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 3372 3641 (queue-fixup 3373 3642 (fixup-x86-vinsn-templates
Note:
See TracChangeset
for help on using the changeset viewer.
