| [13067] | 1 | ;;; Copyright 2009 Clozure Associates
|
|---|
| 2 | ;;; This file is part of Clozure CL.
|
|---|
| 3 | ;;;
|
|---|
| 4 | ;;; Clozure CL is licensed under the terms of the Lisp Lesser GNU
|
|---|
| 5 | ;;; Public License , known as the LLGPL and distributed with Clozure
|
|---|
| 6 | ;;; CL as the file "LICENSE". The LLGPL consists of a preamble and
|
|---|
| 7 | ;;; the LGPL, which is distributed with Clozure CL as the file "LGPL".
|
|---|
| 8 | ;;; Where these conflict, the preamble takes precedence.
|
|---|
| 9 | ;;;
|
|---|
| 10 | ;;; Clozure CL is referenced in the preamble as the "LIBRARY."
|
|---|
| 11 | ;;;
|
|---|
| 12 | ;;; The LLGPL is also available online at
|
|---|
| 13 | ;;; http://opensource.franz.com/preamble.html
|
|---|
| 14 |
|
|---|
| [7332] | 15 | (in-package "CCL")
|
|---|
| 16 |
|
|---|
| 17 | (eval-when (:compile-toplevel :execute)
|
|---|
| 18 | (require "X8632-ARCH")
|
|---|
| 19 | (require "X86-LAPMACROS"))
|
|---|
| 20 |
|
|---|
| [7910] | 21 | ;; rewrite in LAP someday (soon).
|
|---|
| 22 | (defun %init-misc (val uvector)
|
|---|
| 23 | (dotimes (i (uvsize uvector) uvector)
|
|---|
| 24 | (setf (uvref uvector i) val)))
|
|---|
| 25 |
|
|---|
| 26 | ;;; Make a new vector of size newsize whose subtag matches that of oldv-arg.
|
|---|
| 27 | ;;; Blast the contents of the old vector into the new one as quickly as
|
|---|
| 28 | ;;; possible; leave remaining elements of new vector undefined (0).
|
|---|
| 29 | ;;; Return new-vector.
|
|---|
| [15165] | 30 |
|
|---|
| [7910] | 31 |
|
|---|
| [7349] | 32 | ;;; argument is a vector header or an array header. Or else.
|
|---|
| [7910] | 33 | (defx8632lapfunction %array-header-data-and-offset ((a arg_z))
|
|---|
| [7349] | 34 | (let ((offset arg_y)
|
|---|
| 35 | (temp temp1))
|
|---|
| 36 | (movl (% esp) (% temp0))
|
|---|
| 37 | (movl ($ '0) (%l offset))
|
|---|
| 38 | (movl (% a) (% temp))
|
|---|
| 39 | @loop
|
|---|
| 40 | (movl (@ target::arrayH.data-vector (% temp)) (% a))
|
|---|
| 41 | (extract-subtag a imm0)
|
|---|
| 42 | (addl (@ target::arrayH.displacement (% temp)) (% offset))
|
|---|
| [16078] | 43 | (movl (% a) (% temp))
|
|---|
| [7349] | 44 | (rcmp (% imm0) ($ target::subtag-vectorH))
|
|---|
| [16000] | 45 | (je @loop)
|
|---|
| [16078] | 46 | (rcmp (% imm0) ($ target::subtag-arrayH))
|
|---|
| 47 | (je @loop)
|
|---|
| [7349] | 48 | (push (% a))
|
|---|
| 49 | (push (% offset))
|
|---|
| 50 | (set-nargs 2)
|
|---|
| 51 | (jmp-subprim .SPvalues)))
|
|---|
| 52 |
|
|---|
| [13412] | 53 | (defx8632lapfunction %boole-clr ((len 8) (b0 4) #|(ra 0)|# (b1 arg_y) (dest arg_z))
|
|---|
| 54 | (movl (@ len (% esp)) (% temp0))
|
|---|
| 55 | (jmp @test)
|
|---|
| 56 | @loop
|
|---|
| [7349] | 57 | (movl ($ 0) (@ x8632::misc-data-offset (% dest) (% temp0)))
|
|---|
| [13412] | 58 | @test
|
|---|
| 59 | (subl ($ '1) (% temp0))
|
|---|
| 60 | (jge @loop)
|
|---|
| [7349] | 61 | (single-value-return 4))
|
|---|
| 62 |
|
|---|
| [13412] | 63 | (defx8632lapfunction %boole-set ((len 8) (b0 4) #|(ra 0)|# (b1 arg_y) (dest arg_z))
|
|---|
| 64 | (movl (@ len (% esp)) (% temp0))
|
|---|
| 65 | (jmp @test)
|
|---|
| 66 | @loop
|
|---|
| [7349] | 67 | (movl ($ -1) (@ x8632::misc-data-offset (% dest) (% temp0)))
|
|---|
| [13412] | 68 | @test
|
|---|
| 69 | (subl ($ '1) (% temp0))
|
|---|
| 70 | (jge @loop)
|
|---|
| [7349] | 71 | (single-value-return 4))
|
|---|
| 72 |
|
|---|
| [13412] | 73 | (defx8632lapfunction %boole-1 ((len 8) (b0 4) #|(ra 0)|# (b1 arg_y) (dest arg_z))
|
|---|
| 74 | (movl (@ len (% esp)) (% temp0))
|
|---|
| 75 | (jmp @test)
|
|---|
| 76 | @loop
|
|---|
| [7349] | 77 | (movl (@ b0 (% esp)) (% temp1))
|
|---|
| 78 | (movl (@ x8632::misc-data-offset (% temp1) (% temp0)) (% imm0))
|
|---|
| 79 | (movl (% imm0) (@ x8632::misc-data-offset (% dest) (% temp0)))
|
|---|
| [13412] | 80 | @test
|
|---|
| 81 | (subl ($ '1) (% temp0))
|
|---|
| 82 | (jge @loop)
|
|---|
| [7349] | 83 | (single-value-return 4))
|
|---|
| 84 |
|
|---|
| [13412] | 85 | (defx8632lapfunction %boole-2 ((len 8) (b0 4) #|(ra 0)|# (b1 arg_y) (dest arg_z))
|
|---|
| 86 | (movl (@ len (% esp)) (% temp0))
|
|---|
| 87 | (jmp @test)
|
|---|
| 88 | @loop
|
|---|
| [7349] | 89 | (movl (@ x8632::misc-data-offset (% b1) (% temp0)) (% imm0))
|
|---|
| 90 | (movl (% imm0) (@ x8632::misc-data-offset (% dest) (% temp0)))
|
|---|
| [13412] | 91 | @test
|
|---|
| 92 | (subl ($ '1) (% temp0))
|
|---|
| 93 | (jge @loop)
|
|---|
| [7349] | 94 | (single-value-return 4))
|
|---|
| 95 |
|
|---|
| [13412] | 96 | (defx8632lapfunction %boole-c1 ((len 8) (b0 4) #|(ra 0)|# (b1 arg_y) (dest arg_z))
|
|---|
| 97 | (movl (@ len (% esp)) (% temp0))
|
|---|
| 98 | (jmp @test)
|
|---|
| 99 | @loop
|
|---|
| [7349] | 100 | (movl (@ b0 (% esp)) (% temp1))
|
|---|
| 101 | (movl (@ x8632::misc-data-offset (% temp1) (% temp0)) (% imm0))
|
|---|
| 102 | (notl (% imm0))
|
|---|
| 103 | (movl (% imm0) (@ x8632::misc-data-offset (% dest) (% temp0)))
|
|---|
| [13412] | 104 | @test
|
|---|
| 105 | (subl ($ '1) (% temp0))
|
|---|
| 106 | (jge @loop)
|
|---|
| [7349] | 107 | (single-value-return 4))
|
|---|
| 108 |
|
|---|
| [13412] | 109 | (defx8632lapfunction %boole-c2 ((len 8) (b0 4) #|(ra 0)|# (b1 arg_y) (dest arg_z))
|
|---|
| 110 | (movl (@ len (% esp)) (% temp0))
|
|---|
| 111 | (jmp @test)
|
|---|
| 112 | @loop
|
|---|
| [7349] | 113 | (movl (@ x8632::misc-data-offset (% b1) (% temp0)) (% imm0))
|
|---|
| 114 | (notl (% imm0))
|
|---|
| 115 | (movl (% imm0) (@ x8632::misc-data-offset (% dest) (% temp0)))
|
|---|
| [13412] | 116 | @test
|
|---|
| 117 | (subl ($ '1) (% temp0))
|
|---|
| 118 | (jge @loop)
|
|---|
| [7349] | 119 | (single-value-return 4))
|
|---|
| 120 |
|
|---|
| [13412] | 121 | (defx8632lapfunction %boole-and ((len 8) (b0 4) #|(ra 0)|# (b1 arg_y) (dest arg_z))
|
|---|
| 122 | (movl (@ len (% esp)) (% temp0))
|
|---|
| 123 | (jmp @test)
|
|---|
| 124 | @loop
|
|---|
| [7349] | 125 | (movl (@ b0 (% esp)) (% temp1))
|
|---|
| 126 | (movl (@ x8632::misc-data-offset (% temp1) (% temp0)) (% imm0))
|
|---|
| 127 | (andl (@ x8632::misc-data-offset (% b1) (% temp0)) (% imm0))
|
|---|
| 128 | (movl (% imm0) (@ x8632::misc-data-offset (% dest) (% temp0)))
|
|---|
| [13412] | 129 | @test
|
|---|
| 130 | (subl ($ '1) (% temp0))
|
|---|
| 131 | (jge @loop)
|
|---|
| [7349] | 132 | (single-value-return 4))
|
|---|
| 133 |
|
|---|
| [13412] | 134 | (defx8632lapfunction %boole-ior ((len 8) (b0 4) #|(ra 0)|# (b1 arg_y) (dest arg_z))
|
|---|
| 135 | (movl (@ len (% esp)) (% temp0))
|
|---|
| 136 | (jmp @test)
|
|---|
| 137 | @loop
|
|---|
| [7349] | 138 | (movl (@ b0 (% esp)) (% temp1))
|
|---|
| 139 | (movl (@ x8632::misc-data-offset (% temp1) (% temp0)) (% imm0))
|
|---|
| 140 | (orl (@ x8632::misc-data-offset (% b1) (% temp0)) (% imm0))
|
|---|
| 141 | (movl (% imm0) (@ x8632::misc-data-offset (% dest) (% temp0)))
|
|---|
| [13412] | 142 | @test
|
|---|
| 143 | (subl ($ '1) (% temp0))
|
|---|
| 144 | (jge @loop)
|
|---|
| [7349] | 145 | (single-value-return 4))
|
|---|
| 146 |
|
|---|
| [13412] | 147 | (defx8632lapfunction %boole-xor ((len 8) (b0 4) #|(ra 0)|# (b1 arg_y) (dest arg_z))
|
|---|
| 148 | (movl (@ len (% esp)) (% temp0))
|
|---|
| 149 | (jmp @test)
|
|---|
| 150 | @loop
|
|---|
| [7349] | 151 | (movl (@ b0 (% esp)) (% temp1))
|
|---|
| 152 | (movl (@ x8632::misc-data-offset (% temp1) (% temp0)) (% imm0))
|
|---|
| 153 | (xorl (@ x8632::misc-data-offset (% b1) (% temp0)) (% imm0))
|
|---|
| 154 | (movl (% imm0) (@ x8632::misc-data-offset (% dest) (% temp0)))
|
|---|
| [13412] | 155 | @test
|
|---|
| 156 | (subl ($ '1) (% temp0))
|
|---|
| 157 | (jge @loop)
|
|---|
| [7349] | 158 | (single-value-return 4))
|
|---|
| 159 |
|
|---|
| [13412] | 160 | (defx8632lapfunction %boole-eqv ((len 8) (b0 4) #|(ra 0)|# (b1 arg_y) (dest arg_z))
|
|---|
| 161 | (movl (@ len (% esp)) (% temp0))
|
|---|
| 162 | (jmp @test)
|
|---|
| 163 | @loop
|
|---|
| [7349] | 164 | (movl (@ b0 (% esp)) (% temp1))
|
|---|
| 165 | (movl (@ x8632::misc-data-offset (% temp1) (% temp0)) (% imm0))
|
|---|
| 166 | (xorl (@ x8632::misc-data-offset (% b1) (% temp0)) (% imm0))
|
|---|
| 167 | (notl (% imm0))
|
|---|
| 168 | (movl (% imm0) (@ x8632::misc-data-offset (% dest) (% temp0)))
|
|---|
| [13412] | 169 | @test
|
|---|
| 170 | (subl ($ '1) (% temp0))
|
|---|
| 171 | (jge @loop)
|
|---|
| [7349] | 172 | (single-value-return 4))
|
|---|
| 173 |
|
|---|
| [13412] | 174 | (defx8632lapfunction %boole-nand ((len 8) (b0 4) #|(ra 0)|# (b1 arg_y) (dest arg_z))
|
|---|
| 175 | (movl (@ len (% esp)) (% temp0))
|
|---|
| 176 | (jmp @test)
|
|---|
| 177 | @loop
|
|---|
| [7349] | 178 | (movl (@ b0 (% esp)) (% temp1))
|
|---|
| 179 | (movl (@ x8632::misc-data-offset (% temp1) (% temp0)) (% imm0))
|
|---|
| 180 | (andl (@ x8632::misc-data-offset (% b1) (% temp0)) (% imm0))
|
|---|
| 181 | (notl (% imm0))
|
|---|
| 182 | (movl (% imm0) (@ x8632::misc-data-offset (% dest) (% temp0)))
|
|---|
| [13412] | 183 | @test
|
|---|
| 184 | (subl ($ '1) (% temp0))
|
|---|
| 185 | (jge @loop)
|
|---|
| [7349] | 186 | (single-value-return 4))
|
|---|
| 187 |
|
|---|
| [13412] | 188 | (defx8632lapfunction %boole-nor ((len 8) (b0 4) #|(ra 0)|# (b1 arg_y) (dest arg_z))
|
|---|
| 189 | (movl (@ len (% esp)) (% temp0))
|
|---|
| 190 | (jmp @test)
|
|---|
| 191 | @loop
|
|---|
| [7349] | 192 | (movl (@ b0 (% esp)) (% temp1))
|
|---|
| 193 | (movl (@ x8632::misc-data-offset (% temp1) (% temp0)) (% imm0))
|
|---|
| 194 | (orl (@ x8632::misc-data-offset (% b1) (% temp0)) (% imm0))
|
|---|
| 195 | (notl (% imm0))
|
|---|
| 196 | (movl (% imm0) (@ x8632::misc-data-offset (% dest) (% temp0)))
|
|---|
| [13412] | 197 | @test
|
|---|
| 198 | (subl ($ '1) (% temp0))
|
|---|
| 199 | (jge @loop)
|
|---|
| [7349] | 200 | (single-value-return 4))
|
|---|
| 201 |
|
|---|
| [13412] | 202 | (defx8632lapfunction %boole-andc1 ((len 8) (b0 4) #|(ra 0)|# (b1 arg_y) (dest arg_z))
|
|---|
| 203 | (movl (@ len (% esp)) (% temp0))
|
|---|
| 204 | (jmp @test)
|
|---|
| 205 | @loop
|
|---|
| [7349] | 206 | (movl (@ b0 (% esp)) (% temp1))
|
|---|
| 207 | (movl (@ x8632::misc-data-offset (% temp1) (% temp0)) (% imm0))
|
|---|
| 208 | (notl (% imm0))
|
|---|
| 209 | (andl (@ x8632::misc-data-offset (% b1) (% temp0)) (% imm0))
|
|---|
| 210 | (movl (% imm0) (@ x8632::misc-data-offset (% dest) (% temp0)))
|
|---|
| [13412] | 211 | @test
|
|---|
| 212 | (subl ($ '1) (% temp0))
|
|---|
| 213 | (jge @loop)
|
|---|
| [7349] | 214 | (single-value-return 4))
|
|---|
| 215 |
|
|---|
| [13412] | 216 | (defx8632lapfunction %boole-andc2 ((len 8) (b0 4) #|(ra 0)|# (b1 arg_y) (dest arg_z))
|
|---|
| 217 | (movl (@ len (% esp)) (% temp0))
|
|---|
| 218 | (jmp @test)
|
|---|
| 219 | @loop
|
|---|
| [7349] | 220 | (movl (@ b0 (% esp)) (% temp1))
|
|---|
| 221 | (movl (@ x8632::misc-data-offset (% b1) (% temp0)) (% imm0))
|
|---|
| 222 | (notl (% imm0))
|
|---|
| 223 | (andl (@ x8632::misc-data-offset (% temp1) (% temp0)) (% imm0))
|
|---|
| 224 | (movl (% imm0) (@ x8632::misc-data-offset (% dest) (% temp0)))
|
|---|
| [13412] | 225 | @test
|
|---|
| 226 | (subl ($ '1) (% temp0))
|
|---|
| 227 | (jge @loop)
|
|---|
| [7349] | 228 | (single-value-return 4))
|
|---|
| 229 |
|
|---|
| [13412] | 230 | (defx8632lapfunction %boole-orc1 ((len 8) (b0 4) #|(ra 0)|# (b1 arg_y) (dest arg_z))
|
|---|
| 231 | (movl (@ len (% esp)) (% temp0))
|
|---|
| 232 | (jmp @test)
|
|---|
| 233 | @loop
|
|---|
| [7349] | 234 | (movl (@ b0 (% esp)) (% temp1))
|
|---|
| 235 | (movl (@ x8632::misc-data-offset (% temp1) (% temp0)) (% imm0))
|
|---|
| 236 | (notl (% imm0))
|
|---|
| 237 | (orl (@ x8632::misc-data-offset (% b1) (% temp0)) (% imm0))
|
|---|
| 238 | (movl (% imm0) (@ x8632::misc-data-offset (% dest) (% temp0)))
|
|---|
| [13412] | 239 | @test
|
|---|
| 240 | (subl ($ '1) (% temp0))
|
|---|
| 241 | (jge @loop)
|
|---|
| [7349] | 242 | (single-value-return 4))
|
|---|
| 243 |
|
|---|
| [13412] | 244 | (defx8632lapfunction %boole-orc2 ((len 8) (b0 4) #|(ra 0)|# (b1 arg_y) (dest arg_z))
|
|---|
| 245 | (movl (@ len (% esp)) (% temp0))
|
|---|
| 246 | (jmp @test)
|
|---|
| 247 | @loop
|
|---|
| [7349] | 248 | (movl (@ b0 (% esp)) (% temp1))
|
|---|
| 249 | (movl (@ x8632::misc-data-offset (% b1) (% temp0)) (% imm0))
|
|---|
| 250 | (notl (% imm0))
|
|---|
| 251 | (orl (@ x8632::misc-data-offset (% temp1) (% temp0)) (% imm0))
|
|---|
| 252 | (movl (% imm0) (@ x8632::misc-data-offset (% dest) (% temp0)))
|
|---|
| [13412] | 253 | @test
|
|---|
| 254 | (subl ($ '1) (% temp0))
|
|---|
| 255 | (jge @loop)
|
|---|
| [7349] | 256 | (single-value-return 4))
|
|---|
| 257 |
|
|---|
| [7910] | 258 | (defparameter *simple-bit-boole-functions* ())
|
|---|
| 259 |
|
|---|
| 260 | (setq *simple-bit-boole-functions*
|
|---|
| 261 | (vector
|
|---|
| 262 | #'%boole-clr
|
|---|
| 263 | #'%boole-set
|
|---|
| 264 | #'%boole-1
|
|---|
| 265 | #'%boole-2
|
|---|
| 266 | #'%boole-c1
|
|---|
| 267 | #'%boole-c2
|
|---|
| 268 | #'%boole-and
|
|---|
| 269 | #'%boole-ior
|
|---|
| 270 | #'%boole-xor
|
|---|
| 271 | #'%boole-eqv
|
|---|
| 272 | #'%boole-nand
|
|---|
| 273 | #'%boole-nor
|
|---|
| 274 | #'%boole-andc1
|
|---|
| 275 | #'%boole-andc2
|
|---|
| 276 | #'%boole-orc1
|
|---|
| 277 | #'%boole-orc2))
|
|---|
| 278 |
|
|---|
| 279 | (defun %simple-bit-boole (op b1 b2 result)
|
|---|
| [13412] | 280 | (funcall (svref *simple-bit-boole-functions* op)
|
|---|
| 281 | (ash (the fixnum (+ (length result) 31)) -5)
|
|---|
| 282 | b1
|
|---|
| 283 | b2
|
|---|
| 284 | result))
|
|---|
| [7910] | 285 |
|
|---|
| [9673] | 286 | (defx8632lapfunction %aref2 ((array 4) #|(ra 0)|# (i arg_y) (j arg_z))
|
|---|
| 287 | (check-nargs 3)
|
|---|
| 288 | (popl (@ 8 (% esp))) ;ra to first word of reserved frame
|
|---|
| 289 | (pop (% temp0))
|
|---|
| 290 | (addl ($ '1) (% esp)) ;discard other word of reserved frame
|
|---|
| 291 | (jmp-subprim .SParef2))
|
|---|
| [7332] | 292 |
|
|---|
| [9673] | 293 | (defx8632lapfunction %aref3 ((array 8) (i 4) #|(ra 0)|# (j arg_y) (k arg_z))
|
|---|
| 294 | (check-nargs 4)
|
|---|
| 295 | (popl (@ 12 (% esp)))
|
|---|
| 296 | (pop (% temp0))
|
|---|
| 297 | (pop (% temp1))
|
|---|
| 298 | (addl ($ '1) (% esp))
|
|---|
| 299 | (jmp-subprim .SParef3))
|
|---|
| [7332] | 300 |
|
|---|
| [9673] | 301 | (defx8632lapfunction %aset2 ((array 8) (i 4) #|(ra 0)|# (j arg_y) (newval arg_z))
|
|---|
| 302 | (check-nargs 4)
|
|---|
| 303 | (popl (@ 12 (% esp)))
|
|---|
| 304 | (pop (% temp0))
|
|---|
| 305 | (pop (% temp1))
|
|---|
| 306 | (addl ($ '1) (% esp))
|
|---|
| 307 | (jmp-subprim .SPaset2))
|
|---|
| [7332] | 308 |
|
|---|
| [11238] | 309 | ;;; We're out of registers. Put i on the stack.
|
|---|
| [11222] | 310 | (defx8632lapfunction %aset3 ((array 12) (i 8) (j 4) #|(ra 0)|# (k arg_y) (newval arg_z))
|
|---|
| [9673] | 311 | (check-nargs 5)
|
|---|
| 312 | (popl (@ 16 (% esp)))
|
|---|
| 313 | (pop (% temp0))
|
|---|
| [11238] | 314 | (popl (@ 4 (% esp)))
|
|---|
| [9673] | 315 | (pop (% temp1))
|
|---|
| 316 | (jmp-subprim .SPaset3))
|
|---|
| [7332] | 317 |
|
|---|