Changeset 13903 for branches/arm/lib/ffi-linuxarm.lisp
- Timestamp:
- Jun 30, 2010, 5:41:03 PM (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/arm/lib/ffi-linuxarm.lisp
r13778 r13903 90 90 ;;; A FOREIGN-TYPE representing the "actual" return type. 91 91 ;;; A form which can be used to initialize FP-ARGS-PTR, relative 92 ;;; to STACK-PTR. (This is unused on linux ppc32.)92 ;;; to STACK-PTR. (This is unused on linuxarm.) 93 93 ;;; The byte offset of the foreign return address, relative to STACK-PTR 94 94 (defun arm-linux::generate-callback-bindings (stack-ptr fp-args-ptr argvars argspecs result-spec struct-result-name) … … 105 105 argspecs (cons :address argspecs) 106 106 rtype *void-foreign-type*)))) 107 (let* ((offset 96) 108 (gpr 0) 109 (fpr 32)) 107 (let* ((offset 0) 108 (nextoffset offset)) 110 109 (do* ((argvars argvars (cdr argvars)) 111 110 (argspecs argspecs (cdr argspecs))) … … 114 113 (let* ((name (car argvars)) 115 114 (spec (car argspecs)) 116 (nextgpr gpr)117 (nextfpr fpr)118 (nextoffset offset)119 (target gpr)120 (bias 0)121 115 (argtype (parse-foreign-type spec))) 122 116 (if (typep argtype 'foreign-record-type) … … 125 119 `(,(cond 126 120 ((typep argtype 'foreign-single-float-type) 127 (incf nextfpr 8) 128 (if (< fpr 96) 129 (setq target fpr) 130 (setq target (+ offset (logand offset 4)) 131 nextoffset (+ target 8))) 121 (setq nextoffset (+ offset 4)) 132 122 '%get-single-float-from-double-ptr) 133 123 ((typep argtype 'foreign-double-float-type) 134 (incf nextfpr 8) 135 (if (< fpr 96) 136 (setq target fpr) 137 (setq target (+ offset (logand offset 4)) 138 nextoffset (+ target 8))) 124 (when (logtest offset 4) 125 (incf offset 4)) 126 (setq nextoffset (+ offset 8)) 139 127 '%get-double-float) 140 128 ((and (typep argtype 'foreign-integer-type) 141 129 (= (foreign-integer-type-bits argtype) 64) 142 130 (foreign-integer-type-signed argtype)) 143 (if (< gpr 56) 144 (setq target (+ gpr (logand gpr 4)) 145 nextgpr (+ 8 target)) 146 (setq target (+ offset (logand offset 4)) 147 nextoffset (+ 8 offset))) 148 '%%get-signed-longlong) 131 (when (logtest offset 4) 132 (incf offset 4)) 133 (setq nextoffset (+ offset 8)) 134 '%%get-signed-longlong) 149 135 ((and (typep argtype 'foreign-integer-type) 150 136 (= (foreign-integer-type-bits argtype) 64) 151 137 (not (foreign-integer-type-signed argtype))) 152 (if (< gpr 56) 153 (setq target (+ gpr (logand gpr 4)) 154 nextgpr (+ 8 target)) 155 (setq target (+ offset (logand offset 4)) 156 nextoffset (+ 8 offset))) 138 (when (logtest offset 4) 139 (incf offset 4)) 140 (setq nextoffset (+ offset 8)) 157 141 '%%get-unsigned-longlong) 158 142 (t 159 (incf nextgpr 4) 160 (if (< gpr 64) 161 (setq target gpr) 162 (setq target offset nextoffset (+ offset 4))) 143 (setq nextoffset (+ offset 4)) 163 144 (cond ((typep argtype 'foreign-pointer-type) '%get-ptr) 164 145 ((typep argtype 'foreign-integer-type) … … 166 147 (signed (foreign-integer-type-signed argtype))) 167 148 (cond ((<= bits 8) 168 (setq bias 3)169 149 (if signed 170 150 '%get-signed-byte ' 171 151 '%get-unsigned-byte)) 172 152 ((<= bits 16) 173 (setq bias 2)174 153 (if signed 175 154 '%get-signed-word … … 184 163 (error "Don't know how to access foreign argument of type ~s" (unparse-foreign-type argtype)))))) 185 164 ,stack-ptr 186 , (+ target bias))))165 ,offset))) 187 166 (when name (lets (list name access-form))) 188 #+nil 189 (when (eq spec :address) 190 (dynamic-extent-names name)) 191 (setq gpr nextgpr fpr nextfpr offset nextoffset)))))))) 167 (setq offset nextoffset)))))))) 192 168 193 169 (defun arm-linux::generate-callback-return-value (stack-ptr fp-args-ptr result return-type struct-return-arg) 194 170 (declare (ignore fp-args-ptr)) 195 171 (unless (eq return-type *void-foreign-type*) 196 (when (typep return-type 'foreign-single-float-type)197 (setq result `(float ,result 0.0d0)))198 172 (let* ((return-type-keyword 199 173 (if (typep return-type 'foreign-record-type) … … 202 176 :unsigned-doubleword) 203 177 (foreign-type-to-representation-type return-type))) 204 (offset (case return-type-keyword 205 ((:single-float :double-float) 206 8) 207 (t 0)))) 178 (offset -8)) 208 179 `(setf (, 209 180 (case return-type-keyword
Note: See TracChangeset
for help on using the changeset viewer.