X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fmips%2Fmacros.lisp;h=943df6304581979fae2fad1847edfb9702927c05;hb=4ed3f0d08c3a57a6762018d9622f253ab9d0f2b6;hp=7f8f0770c4393d9942364280e3daf167e3df8c55;hpb=4ae1b794a5d6a90794468cf8017f5307f2c30dfe;p=sbcl.git diff --git a/src/compiler/mips/macros.lisp b/src/compiler/mips/macros.lisp index 7f8f077..943df63 100644 --- a/src/compiler/mips/macros.lisp +++ b/src/compiler/mips/macros.lisp @@ -1,3 +1,13 @@ +;;;; various useful macros for generating MIPS code + +;;;; This software is part of the SBCL system. See the README file for +;;;; more information. +;;;; +;;;; This software is derived from the CMU CL system, which was +;;;; written at Carnegie Mellon University and released into the +;;;; public domain. The software is in the public domain and is +;;;; provided with absolutely no warranty. See the COPYING and CREDITS +;;;; files for more information. (in-package "SB!VM") ;;; Handy macro for defining top-level forms that depend on the compile @@ -95,10 +105,7 @@ ;;;; Stack TN's -;;; Load-Stack-TN, Store-Stack-TN -- Interface -;;; -;;; Move a stack TN to a register and vice-versa. -;;; +;;; Move a stack TN to a register and vice-versa. (defmacro load-stack-tn (reg stack) `(let ((reg ,reg) (stack ,stack)) @@ -106,7 +113,6 @@ (sc-case stack ((control-stack) (loadw reg cfp-tn offset)))))) - (defmacro store-stack-tn (stack reg) `(let ((stack ,stack) (reg ,reg)) @@ -115,9 +121,6 @@ ((control-stack) (storew reg cfp-tn offset)))))) - -;;; MAYBE-LOAD-STACK-TN -- Interface -;;; (defmacro maybe-load-stack-tn (reg reg-or-stack) "Move the TN Reg-Or-Stack into Reg if it isn't already there." (once-only ((n-reg reg) @@ -132,7 +135,6 @@ ;;;; Storage allocation: - (defmacro with-fixed-allocation ((result-tn flag-tn temp-tn type-code size) &body body) "Do stuff to allocate an other-pointer object of fixed Size with a single @@ -149,7 +151,6 @@ ;;;; Three Way Comparison - (defun three-way-comparison (x y condition flavor not-p target temp) (ecase condition (:eq @@ -179,22 +180,6 @@ ;;;; Error Code - - -(defvar *adjustable-vectors* nil) - -(defmacro with-adjustable-vector ((var) &rest body) - `(let ((,var (or (pop *adjustable-vectors*) - (make-array 16 - :element-type '(unsigned-byte 8) - :fill-pointer 0 - :adjustable t)))) - (setf (fill-pointer ,var) 0) - (unwind-protect - (progn - ,@body) - (push ,var *adjustable-vectors*)))) - (eval-when (compile load eval) (defun emit-error-break (vop kind code values) (let ((vector (gensym))) @@ -243,8 +228,7 @@ Emit code for a continuable error with the specified Error-Code and context Values. If the error is continued, execution resumes after the GENERATE-CERROR-CODE form." - (let ((continue (gensym "CONTINUE-LABEL-")) - (error (gensym "ERROR-LABEL-"))) + (with-unique-names (continue error) `(let ((,continue (gen-label))) (emit-label ,continue) (assemble (*elsewhere*) @@ -252,9 +236,10 @@ (emit-label ,error) (cerror-call ,vop ,continue ,error-code ,@values) ,error))))) - -;;; PSEUDO-ATOMIC -- Handy macro for making sequences look atomic. +;;;; PSEUDO-ATOMIC + +;;; handy macro for making sequences look atomic (defmacro pseudo-atomic ((flag-tn &key (extra 0)) &rest forms) `(progn (aver (= (tn-offset ,flag-tn) nl4-offset)) @@ -272,10 +257,8 @@ (inst addu alloc-tn (1- ,extra)) (inst break 16) (emit-label label))))) - - -;;;; Memory accessor vop generators +;;;; memory accessor vop generators (deftype load/store-index (scale lowtag min-offset &optional (max-offset min-offset)) @@ -390,7 +373,7 @@ ,(eval offset)))) (:results (value :scs ,scs)) (:result-types ,el-type) - (:generator 5 + (:generator 4 (inst ,(ecase size (:byte (if signed 'lb 'lbu)) (:short (if signed 'lh 'lhu))) @@ -434,9 +417,18 @@ ,el-type) (:results (result :scs ,scs)) (:result-types ,el-type) - (:generator 5 + (:generator 4 (inst ,(ecase size (:byte 'sb) (:short 'sh)) value object - (- (* ,offset n-word-bytes) (* index ,scale) ,lowtag)) + (- (+ (* ,offset n-word-bytes) (* index ,scale)) ,lowtag)) (move result value)))))) + +(defmacro sb!sys::with-pinned-objects ((&rest objects) &body body) + "Arrange with the garbage collector that the pages occupied by +OBJECTS will not be moved in memory for the duration of BODY. +Useful for e.g. foreign calls where another thread may trigger +garbage collection. This is currently implemented by disabling GC" + (declare (ignore objects)) ;should we eval these for side-effect? + `(without-gcing + ,@body))