- Timestamp:
- Nov 16, 2007, 12:04:42 PM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/ia32/compiler/X86/X8632/x8632-vinsns.lisp
r7431 r7659 13 13 (%define-vinsn *x8632-backend* vinsn-name results args temps body)) 14 14 15 ;;; xxx the ia-32 compiler shouldn't generate this 15 16 (define-x8632-vinsn scale-32bit-misc-index (((dest :u32)) 16 17 ((idx :imm) ; A fixnum … … 42 43 ((v :lisp) 43 44 (idx :s32const))) 44 (movsd (:@ (:apply + x8632::misc-d ata-offset (:apply ash idx x8632::word-shift)) (:%l v)) (:%xmm dest)))45 (movsd (:@ (:apply + x8632::misc-dfloat-offset (:apply ash idx x8632::word-shift)) (:%l v)) (:%xmm dest))) 45 46 46 47 (define-x8632-vinsn misc-ref-node (((dest :lisp)) … … 59 60 (unscaled-idx :imm)) 60 61 ()) 61 (movl (:%l val) (:@ x8632::misc-data-offset (:%l v) (:%l unscaled-idx))))62 (movl (:%l val) (:@ x8632::misc-data-offset (:%l v) (:%l unscaled-idx)))) 62 63 63 64 (define-x8632-vinsn misc-set-immediate-node (() … … 73 74 (unscaled-idx :imm)) 74 75 ()) 75 (movsd (:%xmm val) (:@ x8632::misc-d ata-offset (:%l v) (:%l unscaled-idx))))76 (movsd (:%xmm val) (:@ x8632::misc-dfloat-offset (:%l v) (:%l unscaled-idx)))) 76 77 77 78 (define-x8632-vinsn misc-ref-u8 (((dest :u8)) … … 1283 1284 ;;; get-double? 1284 1285 1286 1287 (define-x8632-vinsn copy-double-float (((dest :double-float)) 1288 ((src :double-float))) 1289 (movsd (:%xmm src) (:%xmm dest))) 1290 1285 1291 (define-x8632-vinsn copy-single-float (((dest :single-float)) 1286 1292 ((src :single-float))) … … 1523 1529 (jmp (:@ .SPnthrow1value))) 1524 1530 1531 1532 ;;; xxx I don't know what these next 4 are doing. 1533 (define-x8632-vinsn set-single-c-arg (() 1534 ((arg :single-float) 1535 (offset :u32const))) 1536 (movl (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%l x8632::ra0)) 1537 (movss (:%xmm arg) (:@ (:apply + 8 (:apply ash offset 2)) (:%l x8632::ra0)))) 1538 1539 (define-x8632-vinsn reload-single-c-arg (((arg :single-float)) 1540 ((offset :u32const))) 1541 (movl (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%l x8632::ra0)) 1542 (movss (:@ (:apply + 8 (:apply ash offset 2)) (:%l x8632::ra0)) (:%xmm arg))) 1543 1544 (define-x8632-vinsn set-double-c-arg (() 1545 ((arg :double-float) 1546 (offset :u32const))) 1547 (movl (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%l x8632::ra0)) 1548 (movsd (:%xmm arg) (:@ (:apply + 8 (:apply ash offset 2)) (:%l x8632::ra0)))) 1549 1550 (define-x8632-vinsn reload-double-c-arg (((arg :double-float)) 1551 ((offset :u32const))) 1552 (movl (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%l x8632::ra0)) 1553 (movsd (:@ (:apply + 8 (:apply ash offset 2)) (:%l x8632::ra0)) (:%xmm arg))) 1554 1555 (define-x8632-subprim-call-vinsn (ff-call) .SPffcall) 1556 1557 (define-x8632-subprim-lea-jmp-vinsn (stack-cons-list*) .SPstkconslist-star) 1558 1525 1559 (define-x8632-subprim-lea-jmp-vinsn (list*) .SPconslist-star) 1526 1560 … … 1544 1578 :done) 1545 1579 1580 (define-x8632-vinsn bind-interrupt-level-m1-inline (() 1581 () 1582 ((temp :imm))) 1583 (movl (:@ (:%seg :rcontext) x8632::tcr.tlb-pointer) (:%l temp)) 1584 (pushl (:@ x8632::interrupt-level-binding-index (:%l temp))) 1585 (pushl (:$b x8632::interrupt-level-binding-index)) 1586 (pushl (:@ (:%seg :rcontext) x8632::tcr.db-link)) 1587 (movl (:$l (ash -1 x8632::fixnumshift)) (:@ x8632::interrupt-level-binding-index (:%l temp))) 1588 (movl (:%l x8632::esp) (:@ (:%seg :rcontext) x8632::tcr.db-link))) 1589 1546 1590 (define-x8632-subprim-lea-jmp-vinsn (bind-interrupt-level-m1) .SPbind-interrupt-level-m1) 1547 1591 … … 1549 1593 1550 1594 (define-x8632-subprim-call-vinsn (unbind-interrupt-level) .SPunbind-interrupt-level) 1595 1596 (define-x8632-vinsn unbind-interrupt-level-inline (() 1597 () 1598 ((link :imm) 1599 (curval :imm) 1600 (oldval :imm) 1601 (tlb :imm))) 1602 (movl (:@ (:%seg :rcontext) x8632::tcr.tlb-pointer) (:%l tlb)) 1603 (movl (:@ (:%seg :rcontext) x8632::tcr.db-link) (:%l link)) 1604 (movl (:@ x8632::interrupt-level-binding-index (:%l tlb)) (:%l curval)) 1605 (testl (:%l curval) (:%l curval)) 1606 ;; what's the 16? 1607 (movl (:@ 16 #|binding.val|# (:%l link)) (:%l oldval)) 1608 (movl (:@ #|binding.link|# (:%l link)) (:%l link)) 1609 (movl (:%l oldval) (:@ x8632::interrupt-level-binding-index (:%l tlb))) 1610 (movl (:%l link) (:@ (:%seg :rcontext) x8632::tcr.db-link)) 1611 (jns.pt :done) 1612 (testl (:%l oldval) (:%l oldval)) 1613 (js.pt :done) 1614 (btrl (:$ub 31) (:@ (:%seg :rcontext) x8632::tcr.interrupt-pending)) 1615 (jae.pt :done) 1616 (ud2a) 1617 (:byte 2) 1618 :done) 1551 1619 1552 1620 (define-x8632-vinsn (jump-return-pc :jumpLR) (() … … 1634 1702 (define-x8632-subprim-call-vinsn (subtag-misc-set) .SPsubtag-misc-set) 1635 1703 1704 (define-x8632-vinsn mem-set-c-constant-fullword (() 1705 ((val :s32const) 1706 (dest :address) 1707 (offset :s32const))) 1708 ((:pred = offset 0) 1709 (movl (:$l val) (:@ (:%l dest)))) 1710 ((:not (:pred = offset 0)) 1711 (movl (:$l val) (:@ offset (:%l dest))))) 1712 1713 (define-x8632-vinsn mem-set-c-constant-halfword (() 1714 ((val :s16const) 1715 (dest :address) 1716 (offset :s32const))) 1717 ((:pred = offset 0) 1718 (movw (:$w val) (:@ (:%l dest)))) 1719 ((:not (:pred = offset 0)) 1720 (movw (:$w val) (:@ offset (:%l dest))))) 1721 1722 (define-x8632-vinsn mem-set-c-constant-byte (() 1723 ((val :s8const) 1724 (dest :address) 1725 (offset :s32const))) 1726 ((:pred = offset 0) 1727 (movb (:$b val) (:@ (:%l dest)))) 1728 ((:not (:pred = offset 0)) 1729 (movb (:$b val) (:@ offset (:%l dest))))) 1730 1636 1731 (define-x8632-vinsn mem-ref-c-absolute-u8 (((dest :u8)) 1637 1732 ((addr :s32const))) … … 1661 1756 ((addr :s32const))) 1662 1757 (movl (:@ addr) (:%l dest))) 1758 1759 (define-x8632-vinsn mem-ref-u8 (((dest :u8)) 1760 ((src :address) 1761 (index :s32))) 1762 (movzbl (:@ (:%l src) (:%l index)) (:%l dest))) 1763 1764 (define-x8632-vinsn mem-set-constant-fullword (() 1765 ((val :s32const) 1766 (ptr :address) 1767 (offset :s32))) 1768 (movl (:$l val) (:@ (:%l ptr) (:%l offset)))) 1769 1770 1771 (define-x8632-vinsn mem-set-constant-halfword (() 1772 ((val :s16const) 1773 (ptr :address) 1774 (offset :s32))) 1775 (movw (:$w val) (:@ (:%l ptr) (:%l offset)))) 1776 1777 (define-x8632-vinsn mem-set-constant-byte (() 1778 ((val :s8const) 1779 (ptr :address) 1780 (offset :s32))) 1781 (movb (:$b val) (:@ (:%l ptr) (:%l offset)))) 1663 1782 1664 1783 (define-x8632-vinsn misc-set-u32 (() … … 1668 1787 ()) 1669 1788 (movl (:%l val) (:@ x8632::misc-data-offset (:%l v) (:%l scaled-idx)))) 1789 1790 (define-x8632-vinsn %ilsr (((dest :imm)) 1791 ((count :imm) 1792 (src :imm)) 1793 ((temp :s32) 1794 (shiftcount (:s32 #.x8632::ecx)))) 1795 (movl (:%l count) (:%l temp)) 1796 (sarl (:$ub x8632::fixnumshift) (:%l temp)) 1797 (rcmpl (:%l temp) (:$l 31)) 1798 (cmovbw (:%w temp) (:%w shiftcount)) 1799 (movl (:%l src) (:%l temp)) 1800 (jae :shift-max) 1801 (shrl (:%shift x8632::cl) (:%l temp)) 1802 (jmp :done) 1803 :shift-max 1804 (shrl (:$ub 31) (:%l temp)) 1805 :done 1806 (andb (:$b (lognot x8632::fixnummask)) (:%b temp)) 1807 (movl (:%l temp) (:%l dest))) 1670 1808 1671 1809 (define-x8632-vinsn %iasr-c (((dest :imm)) … … 1756 1894 :got-it) 1757 1895 1896 (define-x8632-vinsn require-simple-vector (() 1897 ((object :lisp)) 1898 ((tag :u8))) 1899 :again 1900 (movb (:%b object) (:%b tag)) 1901 (andb (:$b x8632::fixnummask) (:%b tag)) 1902 (cmpb (:$b x8632::tag-misc) (:%b tag)) 1903 (jne :bad) 1904 (cmpb (:$b x8632::subtag-simple-vector) (:@ x8632::misc-subtag-offset (:%l object))) 1905 (je :got-it) 1906 :bad 1907 (uuo-error-reg-not-type (:%l object) (:$ub arch::error-object-not-simple-vector)) 1908 (jmp :again) 1909 :got-it) 1910 1911 (define-x8632-vinsn require-simple-string (() 1912 ((object :lisp)) 1913 ((tag :u8))) 1914 :again 1915 (movb (:%b object) (:%b tag)) 1916 (andb (:$b x8632::fixnummask) (:%b tag)) 1917 (cmpb (:$b x8632::tag-misc) (:%b tag)) 1918 (jne :bad) 1919 (cmpb (:$b x8632::subtag-simple-base-string) (:@ x8632::misc-subtag-offset (:%l object))) 1920 (je :got-it) 1921 :bad 1922 (uuo-error-reg-not-type (:%l object) (:$ub arch::error-object-not-simple-string)) 1923 (jmp :again) 1924 :got-it) 1925 1926 1758 1927 ;;; naive 1759 1928 (define-x8632-vinsn require-real (() … … 1781 1950 :good) 1782 1951 1952 ;;; naive 1953 (define-x8632-vinsn require-number (() 1954 ((object :lisp)) 1955 ((tag :u8))) 1956 :again 1957 (movl (:%l object) (:%l tag)) 1958 (andb (:$b x8632::tagmask) (:%b tag)) 1959 (cmpb (:$b x8632::tag-fixnum) (:%b tag)) 1960 (je :good) 1961 (cmpb (:$b x8632::tag-misc) (:%b tag)) 1962 (jne :bad) 1963 (movb (:@ x8632::misc-subtag-offset (:%l object)) (:%b tag)) 1964 (cmpb (:$b x8632::subtag-single-float) (:%b tag)) 1965 (je :good) 1966 (cmpb (:$b x8632::subtag-double-float) (:%b tag)) 1967 (je :good) 1968 (cmpb (:$b x8632::subtag-bignum) (:%b tag)) 1969 (je :good) 1970 (cmpb (:$b x8632::subtag-ratio) (:%b tag)) 1971 (je :good) 1972 (cmpb (:$b x8632::subtag-complex) (:%b tag)) 1973 (je :good) 1974 :bad 1975 (uuo-error-reg-not-type (:%l object) (:$ub arch::error-object-not-number)) 1976 (jmp :again) 1977 :good) 1978 1979 (define-x8632-vinsn require-list (() 1980 ((object :lisp)) 1981 ((tag :u8))) 1982 :again 1983 (cmpl (:$l x8632::nil-value) (:%l object)) 1984 (je :good) 1985 (movl (:%l object) (:%l tag)) 1986 (andb (:$b x8632::fulltagmask) (:%b tag)) 1987 (cmpb (:$b x8632::fulltag-cons) (:%b tag)) 1988 (je :good) 1989 (uuo-error-reg-not-type (:%q object) (:$ub arch::error-object-not-list)) 1990 (jmp :again) 1991 :good) 1992 1783 1993 (define-x8632-vinsn require-symbol (() 1784 1994 ((object :lisp)) … … 1798 2008 :got-it) 1799 2009 2010 (define-x8632-vinsn require-character (() 2011 ((object :lisp))) 2012 :again 2013 (cmpl (:$l x8632::subtag-character) (:%l object)) 2014 (je.pt :ok) 2015 (uuo-error-reg-not-type (:%q object) (:$ub arch::error-object-not-character)) 2016 (jmp :again) 2017 :ok) 2018 1800 2019 (define-x8632-vinsn mask-base-char (((dest :u8)) 1801 2020 ((src :lisp))) … … 1881 2100 (movl (:$self 0) (:%l x8632::fn))) 1882 2101 2102 (define-x8632-vinsn %scharcode32 (((code :imm)) 2103 ((str :lisp) 2104 (idx :imm)) 2105 ((imm :u32))) 2106 (movl (:%l idx) (:%l imm)) 2107 (sarl (:$ub 1) (:%l imm)) 2108 (movl (:@ x8632::misc-data-offset (:%l str) (:%l imm)) (:%l imm)) 2109 (imull (:$b x8632::fixnumone) (:%l imm)(:%l code))) 2110 1883 2111 1884 2112 (define-x8632-subprim-jump-vinsn (tail-call-sym-slide) .SPtcallsymslide) … … 1908 2136 (call (:@ spno)) 1909 2137 (movl (:$self 0) (:%l x8632::fn))) 2138 2139 (define-x8632-vinsn %symbol->symptr (((dest :lisp)) 2140 ((src :lisp)) 2141 ((tag :u8))) 2142 ;; nilsym? 2143 (cmpl (:$l x8632::nil-value) (:%l src)) 2144 (je :nilsym) 2145 ;; tag-misc? 2146 (andb (:$b x8664::tagmask) (:%b tag)) 2147 (cmpb (:$b x8664::tag-misc) (:%b tag)) 2148 (jne :bad) 2149 ;; symbol? 2150 (movb (:@ x8632::misc-subtag-offset) (:%b tag)) 2151 (cmpb (:$b x8632::subtag-symbol) (:%b tag)) 2152 (jne :bad) 2153 ((:not (:pred = 2154 (:apply %hard-regspec-value dest) 2155 (:apply %hard-regspec-value src))) 2156 (movl (:% src) (:% dest))) 2157 (jmp :ok) 2158 :bad 2159 (uuo-error-reg-not-tag (:%q src) (:$ub x8632::subtag-symbol)) 2160 :nilsym 2161 (movl (:$l (+ x8632::nil-value x8632::nilsym-offset)) (:%l dest)) 2162 :ok) 1910 2163 1911 2164 (define-x8632-vinsn zero-double-float-register (((dest :double-float)) … … 1998 2251 (xorl (:%l y) (:%l dest))))) 1999 2252 2253 2000 2254 (define-x8632-subprim-call-vinsn (integer-sign) .SPinteger-sign) 2001 2255 … … 2026 2280 (val :double-float))) 2027 2281 (movsd (:%xmm val) (:@ x8664::double-float.value (:%l node)))) 2282 2283 (define-x8632-vinsn set-macptr-address (() 2284 ((addr :address) 2285 (src :lisp)) 2286 ()) 2287 (movl (:%l addr) (:@ x8632::macptr.address (:%l src)))) 2288 2289 (define-x8632-vinsn deref-macptr (((addr :address)) 2290 ((src :lisp)) 2291 ()) 2292 (movl (:@ x8632::macptr.address (:%l src)) (:%l addr))) 2293 2294 (define-x8632-vinsn setup-macptr-allocation (() 2295 ((src :address))) 2296 (movd (:%l src) (:%mmx x8632::mm1)) 2297 (movl (:$l x8632::macptr-header) (:%l x8632::mm0)) 2298 (movl (:$l (- x8632::macptr.size x8632::fulltag-misc)) (:%l x8632::imm0))) 2299 2300 (define-x8632-vinsn %set-new-macptr-value (() 2301 ((ptr :lisp))) 2302 (movd (:%mmx x8632::mm1) (:@ x8632::macptr.address (:%l ptr)))) 2303 2304 ;;; xxx 16? movapd? 2305 (define-x8632-vinsn macptr->stack (((dest :lisp)) 2306 ((ptr :address))) 2307 (movd (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%mmx x8632::stack-temp)) 2308 (subl (:$b (+ 16 x8632::macptr.size)) (:@ (:%seg :rcontext) x8632::tcr.foreign-sp)) 2309 (movl (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%l x8632::ra0)) 2310 (movd (:%mmx x8632::stack-temp) (:@ (:%l x8632::ra0))) 2311 (leal (:@ (+ 16 x8632::fulltag-misc) (:%l x8632::ra0)) (:%l dest)) 2312 (movl (:$l x8632::macptr-header) (:@ x8632::macptr.header (:%l dest))) 2313 (movl (:%l ptr) (:@ x8632::macptr.address (:%l dest))) 2314 (movapd (:%xmm x8632::fpzero) (:@ x8632::macptr.domain (:%l dest)))) 2315 2316 2317 (define-x8632-vinsn fixnum->signed-natural (((dest :s32)) 2318 ((src :imm))) 2319 (movl (:%l src) (:%l dest)) 2320 (sarl (:$ub x8632::fixnumshift) (:%l dest))) 2028 2321 2029 2322 (define-x8632-vinsn %natural+ (((result :u32)) … … 2220 2513 (movl (:$self 0) (:%l x8632::fn))) 2221 2514 2515 (define-x8632-vinsn ref-symbol-value-inline (((dest :lisp)) 2516 ((src (:lisp (:ne dest)))) 2517 ((table :imm) 2518 (idx :imm))) 2519 (movl (:@ x8632::symbol.binding-index (:%l src)) (:%l idx)) 2520 (rcmpl (:%l idx) (:@ (:%seg :rcontext) x8632::tcr.tlb-limit)) 2521 (movl (:@ (:%seg :rcontext) x8632::tcr.tlb-pointer) (:%l table)) 2522 (jae :symbol) 2523 (movl (:@ (:%l table) (:%l idx)) (:%l dest)) 2524 (cmpl (:$l x8632::subtag-no-thread-local-binding) (:%l dest)) 2525 (jne :test) 2526 :symbol 2527 (movl (:@ x8632::symbol.vcell (:%l src)) (:%l dest)) 2528 :test 2529 (cmpl (:$l x8632::unbound-marker) (:%l dest)) 2530 (jne.pt :done) 2531 (uuo-error-unbound (:%l src)) 2532 :done) 2533 2222 2534 (define-x8632-vinsn %ref-symbol-value-inline (((dest :lisp)) 2223 2535 ((src (:lisp (:ne dest)))) … … 2269 2581 (define-x8632-subprim-lea-jmp-vinsn (stack-cons-list) .SPstkconslist) 2270 2582 2583 (define-x8632-vinsn save-lexpr-argregs (() 2584 ((min-fixed :u16const))) 2585 ((:pred >= min-fixed $numx8632argregs) 2586 (pushl (:%l x8632::arg_y)) 2587 (pushl (:%l x8632::arg_z))) 2588 ((:pred = min-fixed 1) ; at least one arg 2589 (rcmpw (:%w x8632::nargs) (:$w (ash 1 x8632::word-shift))) 2590 (je :z1) ;skip arg_y if exactly 1 2591 (pushl (:%l x8632::arg_y)) 2592 :z1 2593 (pushl (:%l x8632::arg_z))) 2594 ((:pred = min-fixed 0) 2595 (rcmpw (:%w x8632::nargs) (:$w (ash 1 x8632::word-shift))) 2596 (je :z0) ;exactly one 2597 (jl :none) ;none 2598 ;two or more... 2599 (pushl (:%l x8632::arg_y)) 2600 :z0 2601 (pushl (:%l x8632::arg_z)) 2602 :none 2603 ) 2604 (movzwl (:%w x8632::nargs) (:%l x8632::nargs)) 2605 ((:not (:pred = min-fixed 0)) 2606 (leal (:@ (:apply - (:apply ash min-fixed x8632::word-shift)) (:%l x8632::nargs)) 2607 (:%l x8632::nargs))) 2608 (pushl (:%l x8632::nargs)) 2609 (movl (:%l x8632::esp) (:%l x8632::arg_z))) 2610 2611 ;;; The frame that was built (by SAVE-LISP-CONTEXT-VARIABLE-ARG-COUNT 2612 ;;; and SAVE-LEXPR-ARGREGS) contains an unknown number of arguments 2613 ;;; followed by the count of non-required arguments; the count is on 2614 ;;; top of the stack and its address is in %arg_z. We need to build a 2615 ;;; frame so that the function can address its arguments (copies of 2616 ;;; the required arguments and the lexpr) and locals; when the 2617 ;;; function returns, it should one or more values (depending on how 2618 ;;; it was called) and discard the hidden lexpr frame. At this point, 2619 ;;; %ra0 still contains the "real" return address. If it's not the 2620 ;;; magic multiple-value address, we can make the function return to 2621 ;;; something that does a single-value return (.SPpopj); otherwise, we 2622 ;;; need to make it return multiple values to the real caller. (Unlike 2623 ;;; the PPC, this case only involves creating one frame here, but that 2624 ;;; frame has two return addresses.) 2625 (define-x8632-vinsn build-lexpr-frame (() 2626 () 2627 ((temp :imm))) 2628 (movl (:@ (+ x8632::nil-value (x8632::%kernel-global 'x86::ret1valaddr))) 2629 (:%l temp)) 2630 (cmpl (:%l temp) 2631 (:%l x8632::ra0)) 2632 (je :multiple) 2633 (pushl (:@ (+ x8632::nil-value (x8632::%kernel-global 'x86::lexpr-return1v)))) 2634 (jmp :finish) 2635 :multiple 2636 (pushl (:@ (+ x8632::nil-value (x8632::%kernel-global 'x86::lexpr-return)))) 2637 (pushl (:%l temp)) 2638 :finish 2639 (pushl (:%l x8632::ebp)) 2640 (movl (:%l x8632::esp) (:%l x8632::ebp))) 2641 2642 (define-x8632-vinsn copy-lexpr-argument (() 2643 ((n :u16const)) 2644 ((temp :imm))) 2645 (movl (:@ (:%l x8632::arg_z)) (:%l temp)) 2646 (pushl (:@ (:apply ash n x8632::word-shift) (:%l x8632::arg_z) (:%l temp)))) 2647 2648 (define-x8632-vinsn %current-tcr (((dest :lisp)) 2649 ()) 2650 (movl (:@ (:%seg :rcontext) x8632::tcr.linear) (:%l dest))) 2271 2651 2272 2652 (define-x8632-vinsn (setq-special :call :subprim-call) … … 2286 2666 ((target :lisp))) 2287 2667 (nop)) 2668 2669 (define-x8632-subprim-lea-jmp-vinsn (spread-lexpr) .SPspread-lexpr-z) 2288 2670 2289 2671 (define-x8632-vinsn symbol-function (((val :lisp)) … … 2317 2699 2318 2700 (define-x8632-subprim-lea-jmp-vinsn (spread-list) .SPspreadargz) 2701 2702 ;;; Even though it's implemented by calling a subprim, THROW is really 2703 ;;; a JUMP (to a possibly unknown destination). If the destination's 2704 ;;; really known, it should probably be inlined (stack-cleanup, value 2705 ;;; transfer & jump ...) 2706 (define-x8632-vinsn (throw :jump :jump-unknown) (() 2707 () 2708 ((entry (:label 1)))) 2709 (leal (:@ (:^ :back) (:%l x8632::fn)) (:%l x8632::ra0)) 2710 (:talign 5) 2711 (jmp (:@ .SPthrow)) 2712 :back 2713 (movl (:$self 0) (:%l x8632::fn))) 2319 2714 2320 2715 (define-x8632-vinsn unbox-base-char (((dest :u32)) … … 2400 2795 (uuo-error-debug-trap)) 2401 2796 2402 2403 2404 2797 (define-x8632-vinsn double-to-single (((result :single-float)) 2798 ((arg :double-float))) 2799 (cvtsd2ss (:%xmm arg) (:%xmm result))) 2800 2801 (define-x8632-vinsn single-to-double (((result :double-float)) 2802 ((arg :single-float))) 2803 (cvtss2sd (:%xmm arg) (:%xmm result))) 2804 2805 (define-x8632-vinsn alloc-c-frame (() 2806 ((nwords :u32const))) 2807 (movd (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%mmx x8632::stack-temp)) 2808 ((:pred < (:apply ash (:apply logandc2 (:apply + nwords 9) 1) x8632::word-shift) 128) 2809 (subl (:$b (:apply ash (:apply logandc2 (:apply + nwords 9) 1) x8632::word-shift)) (:@ (:%seg :rcontext) x8632::tcr.foreign-sp))) 2810 ((:not (:pred < (:apply ash (:apply logandc2 (:apply + nwords 9) 1) x8632::word-shift) 128)) 2811 (subl (:$l (:apply ash (:apply logandc2 (:apply + nwords 9) 1) x8632::word-shift)) (:@ (:%seg :rcontext) x8632::tcr.foreign-sp))) 2812 (movl (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%l x8632::ra0)) 2813 (movd (:%mmx x8632::stack-temp) (:@ (:%l x8632::ra0)))) 2814 2815 ;;; xxx maybe right --- 8? offset 2? 2816 (define-x8632-vinsn set-c-arg (() 2817 ((arg :u32) 2818 (offset :u32const))) 2819 (movl (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%l x8632::ra0)) 2820 (movl (:%l arg) (:@ (:apply + 8 (:apply ash offset 2)) (:%l x8632::ra0)))) 2821 2822 (define-x8632-vinsn eep.address (((dest t)) 2823 ((src (:lisp (:ne dest ))))) 2824 (movl (:@ (+ (ash 1 x8632::word-shift) x8632::misc-data-offset) (:%l src)) 2825 (:%l dest)) 2826 (cmpl (:$l x8632::nil-value) (:%l dest)) 2827 (jne :ok) 2828 (uuo-error-eep-unresolved (:%l src) (:%l dest)) 2829 :ok) 2405 2830 2406 2831 (define-x8632-vinsn %slot-ref (((dest :lisp)) … … 2412 2837 (uuo-error-slot-unbound (:%l dest) (:%l instance) (:%l index)) 2413 2838 :ok) 2839 2840 2414 2841 2415 2842 (define-x8632-vinsn symbol-ref (((dest :lisp)) … … 2490 2917 2491 2918 (define-x8632-vinsn mark-as-imm (() 2492 ((reg : lisp)))2919 ((reg :imm))) 2493 2920 (btrl (:$ub (:apply %hard-regspec-value reg)) (:@ (:%seg :rcontext) x8632::tcr.node-regs-mask))) 2494 2921 2495 2922 (define-x8632-vinsn mark-as-node (() 2496 ((reg : lisp)))2923 ((reg :imm))) 2497 2924 (xorl (:%l reg) (:%l reg)) 2498 2925 (btsl (:$ub (:apply %hard-regspec-value reg)) (:@ (:%seg :rcontext) x8632::tcr.node-regs-mask)))
Note:
See TracChangeset
for help on using the changeset viewer.
