Changeset 7659


Ignore:
Timestamp:
Nov 16, 2007, 8:04:42 PM (12 years ago)
Author:
rme
Message:

Add more vinsns.

File:
1 edited

Legend:

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

    r7431 r7659  
    1313  (%define-vinsn *x8632-backend* vinsn-name results args temps body))
    1414
     15;;; xxx the ia-32 compiler shouldn't generate this
    1516(define-x8632-vinsn scale-32bit-misc-index (((dest :u32))
    1617                                            ((idx :imm) ; A fixnum
     
    4243                                              ((v :lisp)
    4344                                               (idx :s32const)))
    44   (movsd (:@ (:apply + x8632::misc-data-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)))
    4546
    4647(define-x8632-vinsn misc-ref-node  (((dest :lisp))
     
    5960                                    (unscaled-idx :imm))
    6061                                   ())
    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))))
    6263
    6364(define-x8632-vinsn misc-set-immediate-node (()
     
    7374                                    (unscaled-idx :imm))
    7475                                   ())
    75   (movsd (:%xmm val) (:@ x8632::misc-data-offset (:%l v) (:%l unscaled-idx))))
     76  (movsd (:%xmm val) (:@ x8632::misc-dfloat-offset (:%l v) (:%l unscaled-idx))))
    7677
    7778(define-x8632-vinsn misc-ref-u8 (((dest :u8))
     
    12831284;;; get-double?
    12841285
     1286
     1287(define-x8632-vinsn copy-double-float (((dest :double-float))
     1288                                       ((src :double-float)))
     1289  (movsd (:%xmm src) (:%xmm dest)))
     1290
    12851291(define-x8632-vinsn copy-single-float (((dest :single-float))
    12861292                                       ((src :single-float)))
     
    15231529  (jmp (:@ .SPnthrow1value)))
    15241530
     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
    15251559(define-x8632-subprim-lea-jmp-vinsn (list*) .SPconslist-star)
    15261560
     
    15441578  :done)
    15451579
     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
    15461590(define-x8632-subprim-lea-jmp-vinsn (bind-interrupt-level-m1) .SPbind-interrupt-level-m1)
    15471591
     
    15491593
    15501594(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)
    15511619
    15521620(define-x8632-vinsn (jump-return-pc :jumpLR) (()
     
    16341702(define-x8632-subprim-call-vinsn (subtag-misc-set) .SPsubtag-misc-set)
    16351703
     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
    16361731(define-x8632-vinsn mem-ref-c-absolute-u8 (((dest :u8))
    16371732                                           ((addr :s32const)))
     
    16611756                                                   ((addr :s32const)))
    16621757  (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))))
    16631782
    16641783(define-x8632-vinsn misc-set-u32  (()
     
    16681787                                   ())
    16691788  (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)))
    16701808
    16711809(define-x8632-vinsn %iasr-c (((dest :imm))
     
    17561894  :got-it)
    17571895
     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
    17581927;;; naive
    17591928(define-x8632-vinsn require-real (()
     
    17811950  :good)
    17821951
     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
    17831993(define-x8632-vinsn require-symbol (()
    17841994                                    ((object :lisp))
     
    17982008  :got-it)
    17992009
     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
    18002019(define-x8632-vinsn mask-base-char (((dest :u8))
    18012020                                    ((src :lisp)))
     
    18812100  (movl (:$self 0) (:%l x8632::fn)))
    18822101
     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
    18832111
    18842112(define-x8632-subprim-jump-vinsn (tail-call-sym-slide) .SPtcallsymslide)
     
    19082136  (call (:@ spno))
    19092137  (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)
    19102163
    19112164(define-x8632-vinsn zero-double-float-register (((dest :double-float))
     
    19982251    (xorl (:%l y) (:%l dest)))))
    19992252
     2253
    20002254(define-x8632-subprim-call-vinsn (integer-sign) .SPinteger-sign)
    20012255
     
    20262280                                             (val :double-float)))
    20272281  (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)))
    20282321
    20292322(define-x8632-vinsn %natural+  (((result :u32))
     
    22202513  (movl (:$self 0) (:%l x8632::fn)))
    22212514
     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
    22222534(define-x8632-vinsn %ref-symbol-value-inline (((dest :lisp))
    22232535                                              ((src (:lisp (:ne dest))))
     
    22692581(define-x8632-subprim-lea-jmp-vinsn (stack-cons-list)  .SPstkconslist)
    22702582
     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)))
    22712651
    22722652(define-x8632-vinsn (setq-special :call :subprim-call)
     
    22862666                                        ((target :lisp)))
    22872667  (nop))
     2668
     2669(define-x8632-subprim-lea-jmp-vinsn (spread-lexpr)  .SPspread-lexpr-z)
    22882670
    22892671(define-x8632-vinsn symbol-function (((val :lisp))
     
    23172699
    23182700(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)))
    23192714
    23202715(define-x8632-vinsn unbox-base-char (((dest :u32))
     
    24002795  (uuo-error-debug-trap))
    24012796
    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)
    24052830
    24062831(define-x8632-vinsn  %slot-ref (((dest :lisp))
     
    24122837  (uuo-error-slot-unbound (:%l dest) (:%l instance) (:%l index))
    24132838  :ok)
     2839
     2840
    24142841
    24152842(define-x8632-vinsn symbol-ref (((dest :lisp))
     
    24902917
    24912918(define-x8632-vinsn mark-as-imm (()
    2492                                  ((reg :lisp)))
     2919                                 ((reg :imm)))
    24932920  (btrl (:$ub (:apply %hard-regspec-value reg)) (:@ (:%seg :rcontext) x8632::tcr.node-regs-mask)))
    24942921
    24952922(define-x8632-vinsn mark-as-node (()
    2496                                   ((reg :lisp)))
     2923                                  ((reg :imm)))
    24972924  (xorl (:%l reg) (:%l reg))
    24982925  (btsl (:$ub (:apply %hard-regspec-value reg)) (:@ (:%seg :rcontext) x8632::tcr.node-regs-mask)))
Note: See TracChangeset for help on using the changeset viewer.