Changeset 8076


Ignore:
Timestamp:
Jan 15, 2008, 3:13:22 AM (12 years ago)
Author:
rme
Message:

Several changes and additions for IA-32, including mark-as-imm/mark-as-node
macros that alter bits in the TCR to indicate to the GC whether a register
contains a node or an immediate.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/ia32/compiler/X86/x86-lapmacros.lisp

    r7242 r8076  
    7070  (target-arch-case
    7171   (:x8632
    72     (assert (x86-acc-reg-p dest) () "dest reg must be accumulator")
    73     `(progn
    74        (movb ($ x8632::tagmask) (%b ,dest))
    75        (andl (%l ,node) (%l ,dest))))
     72    (if (x86-byte-reg-p dest)
     73      `(progn
     74         (movb ($ x8632::tagmask) (%b ,dest))
     75         (andl (%l ,node) (%l ,dest)))
     76      `(progn
     77         (movl ($ x8632::tagmask) (% ,dest))
     78         (andl (%l ,node) (%l ,dest)))))
    7679   (:x8664
    7780    `(progn
     
    152155     (:x8632
    153156      `(progn
    154          (testb ($ x8632::tagmask) (%b ,node))
     157         (test ($ x8632::tagmask) (% ,node))
    155158         (je.pt ,ok)
    156159         (uuo-error-reg-not-fixnum (% ,node))
     
    192195
    193196(defx86lapmacro get-single-float (node dest)
    194   `(progn
    195     (movd (% ,node) (% ,dest))
    196     (psrlq ($ 32) (% ,dest))))
    197 
    198 
    199 ;;; Note that this modifies the src argument.
     197  (target-arch-case
     198   (:x8632
     199    `(movss (@ x8632::single-float.value (% ,node)) (% ,dest)))
     200   (:x8664
     201    `(progn
     202       (movd (% ,node) (% ,dest))
     203       (psrlq ($ 32) (% ,dest))))))
     204
     205;;; Note that this modifies the src argument in the x8664 case.
    200206(defx86lapmacro put-single-float (src node)
    201   `(progn
    202     (psllq ($ 32) (% ,src))
    203     (movd (% ,src) (% ,node))
    204     (movb ($ x8664::tag-single-float) (%b ,node))))
     207  (target-arch-case
     208   (:x8632
     209    `(movss (% ,src) (@ x8632::single-float.value (% ,node))))
     210   (:x8664
     211    `(progn
     212       (psllq ($ 32) (% ,src))
     213       (movd (% ,src) (% ,node))
     214       (movb ($ x8664::tag-single-float) (%b ,node))))))
    205215
    206216(defx86lapmacro get-double-float (src fpreg)
     
    266276   (:x8632
    267277    `(progn
    268        (movq ($ (lognot 255)) (% ,dest))
    269        (andq (@ x8632::misc-header-offset (% ,vector)) (% ,dest))
     278       (movl ($ (lognot 255)) (% ,dest))
     279       (andl (@ x8632::misc-header-offset (% ,vector)) (% ,dest))
    270280       (shr ($ (- x8632::num-subtag-bits x8632::fixnumshift)) (% ,dest))))
    271281   (:x8664
     
    276286
    277287(defx86lapmacro int-to-double (int temp double)
    278   `(progn
    279     (unbox-fixnum  ,int ,temp)
    280     (cvtsi2sdq (% ,temp) (% ,double))))
     288  (target-arch-case
     289   (:x8632
     290    `(progn
     291       (unbox-fixnum  ,int ,temp)
     292       (cvtsi2sdl (% ,temp) (% ,double))))
     293   (:x8664
     294    `(progn
     295       (unbox-fixnum  ,int ,temp)
     296       (cvtsi2sdq (% ,temp) (% ,double))))))
    281297
    282298(defx86lapmacro int-to-single (int temp single)
    283   `(progn
    284     (unbox-fixnum ,int ,temp)
    285     (cvtsi2ssq (% ,temp) (% ,single))))
     299  (target-arch-case
     300   (:x8632
     301    `(progn
     302       (unbox-fixnum ,int ,temp)
     303       (cvtsi2ssl (% ,temp) (% ,single))))
     304   (:x8664
     305    `(progn
     306       (unbox-fixnum ,int ,temp)
     307       (cvtsi2ssq (% ,temp) (% ,single))))))
    286308
    287309(defx86lapmacro ref-global (global reg)
     
    367389     (:x8632
    368390      `(progn
    369          (movzxwl (% nargs) (% imm0))
     391         (movzwl (% nargs) (% imm0))
    370392         (subl ($ (* $numx8632argregs x8632::node-size)) (% imm0))
    371393         (jle ,push)
    372394         (movl (% ebp) (@ 4 (% esp) (% imm0)))
    373          (leaq (@ 4 (% esp) (% imm0)) (% ebp))
     395         (leal (@ 4 (% esp) (% imm0)) (% ebp))
    374396         (popl (@ (% ebp)))
    375397         (jmp ,done)
     
    512534;;;  those couple of instructions.
    513535
    514 ;;; The above comment appears to be stale.
    515 ;;; %fn (which is distinct from %fname) will be pointing to
    516 ;;; the current function, so it won't get GCed out from under us.
    517536(defx86lapmacro jump-symbol (name nargs)
    518537  (target-arch-case
     
    556575         (push (% arg_z))
    557576         ,done)))))
    558    
     577
     578;;; clears reg
     579(defx86lapmacro mark-as-node (reg)
     580  (let* ((regnum (logand #x7 (x86::gpr-ordinal (string reg))))
     581         (bit (ash 1 regnum)))
     582    `(progn
     583       (xorl (% ,reg) (% ,reg))
     584       (orb ($ ,bit) (@ (% :rcontext) x8632::tcr.node-regs-mask)))))
     585
     586(defx86lapmacro mark-as-imm (reg)
     587  (let* ((regnum (logand #x7 (x86::gpr-ordinal (string reg))))
     588         (bit (ash 1 regnum)))
     589    `(progn
     590       (andb ($ (lognot ,bit)) (@ (% :rcontext) x8632::tcr.node-regs-mask)))))
     591
Note: See TracChangeset for help on using the changeset viewer.