Changeset 8749


Ignore:
Timestamp:
Mar 13, 2008, 4:02:22 AM (11 years ago)
Author:
rme
Message:

X862-MAKE-CLOSURE, X862-LABELS: changes for closures on IA-32.

Also some messing around with x862-i386-syscall.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/ia32/compiler/X86/x862.lisp

    r8688 r8749  
    28432843             (arch (backend-target-arch *target-backend*))
    28442844             (dest ($ *x862-arg-z*))
    2845              (vsize (+ (length inherited-vars)
    2846                        5                ; %closure-code%, afunc
     2845             (vsize (+ (length inherited-vars)
     2846                       (target-arch-case
     2847                        (:x8632 7)
     2848                        (:x8664 5))     ; %closure-code%, afunc
    28472849                       1)))             ; lfun-bits
    28482850        (declare (list inherited-vars))
    2849         (let* ((cell 4))
     2851        (let* ((cell (target-arch-case (:x8632 6)
     2852                                       (:x8664 4))))
    28502853          (declare (fixnum cell))
    28512854          (if downward-p
     
    28682871              (! %allocate-uvector dest)))
    28692872          (! init-nclosure *x862-arg-z*)
     2873          ;;; xxx --- x8632 likely to have register conflicts with *x862-ra0*
    28702874          (x862-store-immediate seg (x862-afunc-lfun-ref afunc) *x862-ra0*)
    28712875          (target-arch-case
     
    81068110  (x862-seq-fbind seg vreg xfer vars afuncs body p2decls))
    81078111
     8112;;; xxx -- update for x8632
    81088113(defx862 x862-labels labels (seg vreg xfer vars afuncs body p2decls)
    81098114  (let* ((fwd-refs nil)
     
    81178122        (push v real-vars)
    81188123        (push func real-funcs)
    8119         (let* ((i 5)                    ; skip 4 words of code, inner function
     8124        (let* ((i (target-arch-case
     8125                   (:x8632 7)
     8126                   (:x8664 5))) ; skip 4 words of code, inner function
    81208127               (our-var nil)
    81218128               (item nil))
     
    81338140      (x862-seq-fbind seg vreg xfer (nreverse real-vars) (nreverse real-funcs) body p2decls)
    81348141      (let* ((old-stack (x862-encode-stack)))
     8142        ;; xxx
     8143        (target-arch-case
     8144         (:x8632 (error "x862-labels not going to work for IA-32")))
    81358145        (setq real-vars (nreverse real-vars) real-funcs (nreverse real-funcs))
    81368146        (with-x86-p2-declarations p2decls
     
    89538963
    89548964(defx862 x862-i386-syscall i386-syscall (seg vreg xfer idx argspecs argvals resultspec &optional monitor-exception-ports)
    8955   (format t "i386-syscall"))
     8965  (declare (ignore monitor-exception-ports))
     8966  (format t "i386-syscall")
     8967  #+notyet
     8968  (progn
     8969    (let* ((*x862-vstack* *x862-vstack*)
     8970           (*x862-top-vstack-lcell* *x862-top-vstack-lcell*)
     8971           (*x862-cstack* *x862-cstack*)
     8972           (offset 0)
     8973           (simple-foreign-args nil)
     8974           (nwords 0))
     8975      (dolist (argspec argspecs)
     8976        (case argspec
     8977          ((:unsigned-doubleword :signed-doubleword)
     8978           (incf nwords 2))
     8979          (t (incf nwords))))
     8980      (when (null argspecs)
     8981        (setq simple-foreign-args t))
     8982      (! alloc-c-frame nwords)
     8983      (x862-open-undo $undo-x86-c-frame)
     8984      (unless simple-foreign-args
     8985        (x862-vpush-register seg (x862-one-untargeted-reg-form seg idx x8632::arg_z)))
     8986      ;; Evaluate each form into the C frame, according to the
     8987      ;; matching argspec.
     8988      (do* ((specs argspecs (cdr specs))
     8989            (vals argvals (cdr vals)))
     8990           ((null specs))
     8991        (declare (list specs vals))
     8992        (let* ((valform (car vals))
     8993               (spec (car specs))
     8994               (absptr (acode-absolute-ptr-p valform)))
     8995          (case spec
     8996            ((:unsigned-doubleword :signed-doubleword)
     8997             (x862-one-targeted-reg-form seg valform ($ x8632::arg_z))
     8998             (if (eq spec :signed-doubleword)
     8999               (! gets64)
     9000               (! getu64))
     9001             (! set-c-arg-from-mm0 nextarg)
     9002             (incf offset 2)
     9003             (:address
     9004              (with-imm-target () (ptr :address)
     9005                (if absptr
     9006                  (x862-lri seg ptr absptr)
     9007                  (x862-form seg ptr nil valform))
     9008                (! set-c-arg ptr offset))
     9009              (incf offset))
     9010             (t
     9011              (if (typep spec 'unsigned-byte)
     9012                (progn
     9013                  (with-imm-target () (ptr :address)
     9014                    (x862-one-targeted-reg-form seg valform ptr)
     9015                    (with-additional-imm-reg (ptr)
     9016                      (with-imm-target (ptr) (r :natural)
     9017                        (dotimes (i spec)
     9018                          (! mem-ref-c-fullword r ptr (ash i x8632::word-shift))
     9019                          (! set-c-arg r offset)))))
     9020                  (incf offset spec))
     9021                (with-imm-target () (valreg :natural)
     9022                  (let* ((reg (x862-unboxed-integer-arg-to-reg seg valform valreg spec)))
     9023                    (! set-c-arg reg offset)
     9024                    (incf offset))))))))
     9025        (unless simple-foreign-args
     9026          (x862-vpop-register seg ($ x8632::arg_z)))
     9027        (! syscall)
     9028        (x862-close-undo)
     9029        (when vreg
     9030          (cond ((eq resultspec :void) (<- nil))
     9031                ((eq resultspec :unsigned-doubleword)
     9032                 (ensuring-node-target (target vreg)
     9033                   ;; xxx -- need to ensure that edx is marked as an imm reg
     9034                   (! makeu64)
     9035                   (x862-copy-register seg target ($ *x862-arg-z*))))
     9036                ((eq resultspec :signed-doubleword)
     9037                 (ensuring-node-target (target vreg)
     9038                   ;; xxx -- need to ensure that edx is marked as an imm reg
     9039                   (! makes64)
     9040                   (x862-copy-register seg target ($ *x862-arg-z*))))
     9041                (t
     9042                 (case resultspec
     9043                   (:signed-byte (! sign-extend-s8 *x862-imm0* *x862-imm0*))
     9044                   (:signed-halfword (! sign-extend-s16 *x862-imm0* *x862-imm0*))
     9045                   (:unsigned-byte (! zero-extend-u8 *x862-imm0* *x862-imm0*))
     9046                   (:unsigned-halfword (! zero-extend-u16 *x862-imm0* *x862-imm0*)))
     9047                 (<- (make-wired-lreg x8632::imm0
     9048                                      :mode
     9049                                      (gpr-mode-name-value
     9050                                       (case resultspec
     9051                                         (:address :address)
     9052                                         (:signed-byte :s8)
     9053                                         (:unsigned-byte :u8)
     9054                                         (:signed-halfword :s16)
     9055                                         (:unsigned-halfword :u16)
     9056                                         (:signed-fullword :s32)
     9057                                         (t :u32))))))))
     9058        (^))))
     9059  )
     9060
    89569061
    89579062(defx862 x862-syscall syscall (seg vreg xfer idx argspecs argvals resultspec &optional monitor-exception-ports)
Note: See TracChangeset for help on using the changeset viewer.