Changeset 13955
- Timestamp:
- Jul 12, 2010, 12:49:43 PM (9 years ago)
- Location:
- branches/arm
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/arm/compiler/ARM/arm-vinsns.lisp
r13921 r13955 32 32 ;;; Index "scaling" and constant-offset misc-ref vinsns. 33 33 34 (define-arm-vinsn scale-node-misc-index (((dest :u32)) 35 ((idx :imm) ; A fixnum 36 ) 37 ()) 34 (define-arm-vinsn (scale-node-misc-index :predicatable) 35 (((dest :u32)) 36 ((idx :imm) ; A fixnum 37 ) 38 ()) 38 39 (add dest idx (:$ arm::misc-data-offset))) 39 40 40 (define-arm-vinsn scale-32bit-misc-index (((dest :u32)) 41 ((idx :imm) ; A fixnum 42 ) 43 ()) 41 (define-arm-vinsn (scale-32bit-misc-index :predicatable) 42 (((dest :u32)) 43 ((idx :imm) ; A fixnum 44 ) 45 ()) 44 46 (add dest idx (:$ arm::misc-data-offset))) 45 47 46 (define-arm-vinsn scale-16bit-misc-index (((dest :u32)) 47 ((idx :imm) ; A fixnum 48 ) 49 ()) 48 (define-arm-vinsn (scale-16bit-misc-index :predicatable) 49 (((dest :u32)) 50 ((idx :imm) ; A fixnum 51 ) 52 ()) 50 53 (mov dest (:lsr idx (:$ 1))) 51 54 (add dest dest (:$ arm::misc-data-offset))) 52 55 53 (define-arm-vinsn scale-8bit-misc-index (((dest :u32)) 54 ((idx :imm) ; A fixnum 55 ) 56 ()) 56 (define-arm-vinsn (scale-8bit-misc-index :predicatable) 57 (((dest :u32)) 58 ((idx :imm) ; A fixnum 59 ) 60 ()) 57 61 (mov dest (:lsr idx (:$ 2))) 58 62 (add dest dest (:$ arm::misc-data-offset))) 59 63 60 (define-arm-vinsn scale-64bit-misc-index (((dest :u32)) 61 ((idx :imm) ; A fixnum 62 ) 63 ()) 64 (define-arm-vinsn (scale-64bit-misc-index :predicatable) 65 (((dest :u32)) 66 ((idx :imm) ; A fixnum 67 ) 68 ()) 64 69 (add dest idx idx) 65 70 (add dest dest (:$ arm::misc-dfloat-offset))) 66 71 67 72 68 (define-arm-vinsn scale-1bit-misc-index (((word-index :u32) 69 (bitnum :u8)) ; (unsigned-byte 5) 70 ((idx :imm) ; A fixnum 71 ) 72 ) 73 (define-arm-vinsn (scale-1bit-misc-index :predicatable) 74 (((word-index :u32) 75 (bitnum :u8)) ; (unsigned-byte 5) 76 ((idx :imm) ; A fixnum 77 ) 78 ) 73 79 (mov word-index (:lsr idx (:$ arm::fixnumshift))) 74 80 (and bitnum word-index (:$ 31)) … … 79 85 80 86 81 (define-arm-vinsn misc-ref-u32 (((dest :u32)) 82 ((v :lisp) 83 (scaled-idx :u32)) 84 ()) 87 (define-arm-vinsn (misc-ref-u32 :predicatable) 88 (((dest :u32)) 89 ((v :lisp) 90 (scaled-idx :u32)) 91 ()) 85 92 (ldr dest (:+@ v scaled-idx))) 86 93 87 94 88 (define-arm-vinsn misc-ref-c-u32 (((dest :u32)) 89 ((v :lisp) 90 (idx :u32const)) 91 ()) 95 (define-arm-vinsn (misc-ref-c-u32 :predicatable) 96 (((dest :u32)) 97 ((v :lisp) 98 (idx :u32const)) 99 ()) 92 100 (ldr dest (:@ v (:$ (:apply + arm::misc-data-offset (:apply ash idx 2)))))) 93 101 94 (define-arm-vinsn misc-ref-s32 (((dest :s32)) 95 ((v :lisp) 96 (scaled-idx :u32)) 97 ()) 102 (define-arm-vinsn (misc-ref-s32 :predicatable) 103 (((dest :s32)) 104 ((v :lisp) 105 (scaled-idx :u32)) 106 ()) 98 107 (ldr dest (:+@ v scaled-idx))) 99 108 100 (define-arm-vinsn misc-ref-c-s32 (((dest :s32)) 101 ((v :lisp) 102 (idx :u32const)) 103 ()) 109 (define-arm-vinsn (misc-ref-c-s32 :predicatable) 110 (((dest :s32)) 111 ((v :lisp) 112 (idx :u32const)) 113 ()) 104 114 (ldr dest (:@ v (:$ (:apply + arm::misc-data-offset (:apply ash idx 2)))))) 105 115 106 116 107 (define-arm-vinsn misc-set-c-u32 (() 108 ((val :u32) 109 (v :lisp) 110 (idx :u32const))) 117 (define-arm-vinsn (misc-set-c-u32 :predicatable) 118 (() 119 ((val :u32) 120 (v :lisp) 121 (idx :u32const))) 111 122 (str val (:@ v (:$ (:apply + arm::misc-data-offset (:apply ash idx 2)))))) 112 123 113 (define-arm-vinsn misc-set-c-s32 (() 114 ((val :s32) 115 (v :lisp) 116 (idx :u32const))) 124 (define-arm-vinsn (misc-set-c-s32 :predicatable) 125 (() 126 ((val :s32) 127 (v :lisp) 128 (idx :u32const))) 117 129 (str val (:@ v (:$ (:apply + arm::misc-data-offset (:apply ash idx 2)))))) 118 130 119 (define-arm-vinsn misc-set-u32 (() 120 ((val :u32) 121 (v :lisp) 122 (scaled-idx :u32))) 131 (define-arm-vinsn (misc-set-u32 :predicatable) 132 (() 133 ((val :u32) 134 (v :lisp) 135 (scaled-idx :u32))) 123 136 (str val (:+@ v scaled-idx))) 124 137 125 (define-arm-vinsn misc-set-s32 (() 126 ((val :s32) 127 (v :lisp) 128 (scaled-idx :u32))) 138 (define-arm-vinsn (misc-set-s32 :predicatable) 139 (() 140 ((val :s32) 141 (v :lisp) 142 (scaled-idx :u32))) 129 143 (str val (:+@ v scaled-idx))) 130 144 131 145 132 (define-arm-vinsn misc-ref-single-float (((dest :single-float)) 133 ((v :lisp) 134 (scaled-idx :u32)) 135 ((temp :u32))) 146 (define-arm-vinsn (misc-ref-single-float :predicatable) 147 (((dest :single-float)) 148 ((v :lisp) 149 (scaled-idx :u32)) 150 ((temp :u32))) 136 151 (ldr temp (:@ v scaled-idx)) 137 152 (fmsr dest temp)) 138 153 139 (define-arm-vinsn misc-ref-c-single-float (((dest :single-float)) 140 ((v :lisp) 141 (idx :u32const)) 142 ((temp :u32))) 154 (define-arm-vinsn (misc-ref-c-single-float :predicatable) 155 (((dest :single-float)) 156 ((v :lisp) 157 (idx :u32const)) 158 ((temp :u32))) 143 159 (ldr temp (:@ v (:$ (:apply + arm::misc-data-offset (:apply ash idx 2))))) 144 160 (fmsr dest temp)) 145 161 146 (define-arm-vinsn misc-ref-double-float (((dest :double-float)) 147 ((v :lisp) 148 (scaled-idx :u32)) 149 ((low (:u32 #.arm::imm0)) 150 (high (:u32 #.arm::imm1)))) 162 (define-arm-vinsn (misc-ref-double-float :predicatable) 163 (((dest :double-float)) 164 ((v :lisp) 165 (scaled-idx :u32)) 166 ((low (:u32 #.arm::imm0)) 167 (high (:u32 #.arm::imm1)))) 151 168 (ldrd low (:@ v scaled-idx)) 152 169 (fmdrr dest low high)) 153 170 154 171 155 (define-arm-vinsn misc-ref-c-double-float (((dest :double-float)) 156 ((v :lisp) 157 (idx :u32const)) 158 ((low (:u32 #.arm::imm0)) 159 (high (:u32 #.arm::imm1)))) 172 (define-arm-vinsn (misc-ref-c-double-float :predicatable) 173 (((dest :double-float)) 174 ((v :lisp) 175 (idx :u32const)) 176 ((low (:u32 #.arm::imm0)) 177 (high (:u32 #.arm::imm1)))) 160 178 (ldrd low (:@ v (:$ idx))) 161 179 (fmdrr dest low high)) 162 180 163 (define-arm-vinsn misc-set-c-double-float (((val :double-float)) 164 ((v :lisp) 165 (idx :u32const)) 166 ((low (:u32 #.arm::imm0)) 167 (high (:u32 #.arm::imm1)))) 181 (define-arm-vinsn (misc-set-c-double-float :predicatable) 182 (((val :double-float)) 183 ((v :lisp) 184 (idx :u32const)) 185 ((low (:u32 #.arm::imm0)) 186 (high (:u32 #.arm::imm1)))) 168 187 (fmrrd low high val) 169 188 (strd low (:@ v (:$ (:apply + arm::misc-dfloat-offset (:apply ash idx 3)))))) 170 189 171 (define-arm-vinsn misc-set-double-float (() 172 ((val :double-float) 173 (v :lisp) 174 (scaled-idx :u32)) 175 ((low (:u32 #.arm::imm0)) 176 (high (:u32 #.arm::imm1)))) 190 (define-arm-vinsn (misc-set-double-float :predicatable) 191 (() 192 ((val :double-float) 193 (v :lisp) 194 (scaled-idx :u32)) 195 ((low (:u32 #.arm::imm0)) 196 (high (:u32 #.arm::imm1)))) 177 197 (fmrrd low high val) 178 198 (strd low (:@ v scaled-idx))) 179 199 180 (define-arm-vinsn misc-set-c-single-float (() 181 ((val :single-float) 182 (v :lisp) 183 (idx :u32const)) 184 ((temp :u32))) 200 (define-arm-vinsn (misc-set-c-single-float :predicatable) 201 (() 202 ((val :single-float) 203 (v :lisp) 204 (idx :u32const)) 205 ((temp :u32))) 185 206 (fmrs temp val) 186 207 (str temp (:@ v (:$ (:apply + arm::misc-data-offset (:apply ash idx 2)))))) … … 188 209 189 210 190 (define-arm-vinsn misc-set-single-float (() 191 ((val :single-float) 192 (v :lisp) 193 (scaled-idx :u32)) 194 ((temp :u32))) 211 (define-arm-vinsn (misc-set-single-float :predicatable) 212 (() 213 ((val :single-float) 214 (v :lisp) 215 (scaled-idx :u32)) 216 ((temp :u32))) 195 217 (fmrs temp val) 196 218 (str temp (:@ v scaled-idx))) 197 219 198 220 199 (define-arm-vinsn misc-ref-u16 (((dest :u16)) 200 ((v :lisp) 201 (scaled-idx :u32)) 202 ()) 221 (define-arm-vinsn (misc-ref-u16 :predicatable) 222 (((dest :u16)) 223 ((v :lisp) 224 (scaled-idx :u32)) 225 ()) 203 226 (ldrh dest (:+@ v scaled-idx))) 204 227 205 (define-arm-vinsn misc-ref-c-u16 (((dest :u16)) 206 ((v :lisp) 207 (idx :u32const)) 208 ()) 228 (define-arm-vinsn (misc-ref-c-u16 :predicatable) 229 (((dest :u16)) 230 ((v :lisp) 231 (idx :u32const)) 232 ()) 209 233 (ldrh dest (:+@ v (:$ (:apply + arm::misc-data-offset (:apply ash idx 1)))))) 210 234 211 (define-arm-vinsn misc-set-c-u16 (((val :u16)) 212 ((v :lisp) 213 (idx :u32const)) 214 ()) 235 (define-arm-vinsn (misc-set-c-u16 :predicatable) 236 (((val :u16)) 237 ((v :lisp) 238 (idx :u32const)) 239 ()) 215 240 (strh val (:+@ v (:$ (:apply + arm::misc-data-offset (:apply ash idx 1)))))) 216 241 217 (define-arm-vinsn misc-set-u16 (((val :u16)) 218 ((v :lisp) 219 (scaled-idx :s32))) 242 (define-arm-vinsn (misc-set-u16 :predicatable) 243 (((val :u16)) 244 ((v :lisp) 245 (scaled-idx :s32))) 220 246 (strh val (:+@ v scaled-idx))) 221 247 … … 226 252 (ldrsh dest (:@ v scaled-idx))) 227 253 228 (define-arm-vinsn misc-ref-c-s16 (((dest :s16)) 229 ((v :lisp) 230 (idx :u32const)) 231 ()) 254 (define-arm-vinsn (misc-ref-c-s16 :predicatable) 255 (((dest :s16)) 256 ((v :lisp) 257 (idx :u32const)) 258 ()) 232 259 (ldrsh dest (:@ v (:$ (:apply + arm::misc-data-offset (:apply ash idx 1)))))) 233 260 234 261 235 (define-arm-vinsn misc-set-c-s16 (((val :s16)) 236 ((v :lisp) 237 (idx :u32const)) 238 ()) 262 (define-arm-vinsn (misc-set-c-s16 :predicatable) 263 (((val :s16)) 264 ((v :lisp) 265 (idx :u32const)) 266 ()) 239 267 (strh val (:@ v (:$ (:apply + arm::misc-data-offset (:apply ash idx 1)))))) 240 268 241 (define-arm-vinsn misc-set-s16 (((val :s16)) 242 ((v :lisp) 243 (scaled-idx :s32))) 269 (define-arm-vinsn (misc-set-s16 :predicatable) 270 (((val :s16)) 271 ((v :lisp) 272 (scaled-idx :s32))) 244 273 (strh val (:@ v scaled-idx))) 245 274 246 (define-arm-vinsn misc-ref-u8 (((dest :u8)) 247 ((v :lisp) 248 (scaled-idx :u32)) 249 ()) 275 (define-arm-vinsn (misc-ref-u8 :predicatable) 276 (((dest :u8)) 277 ((v :lisp) 278 (scaled-idx :u32)) 279 ()) 250 280 (ldrb dest (:@ v scaled-idx))) 251 281 252 (define-arm-vinsn misc-ref-c-u8 (((dest :u8)) 253 ((v :lisp) 254 (idx :u32const)) 255 ()) 282 (define-arm-vinsn (misc-ref-c-u8 :predicatable) 283 (((dest :u8)) 284 ((v :lisp) 285 (idx :u32const)) 286 ()) 256 287 (ldrb dest (:@ v (:$ (:apply + arm::misc-data-offset idx))))) 257 288 258 (define-arm-vinsn misc-set-c-u8 (((val :u8)) 259 ((v :lisp) 260 (idx :u32const)) 261 ()) 289 (define-arm-vinsn (misc-set-c-u8 :predicatable) 290 (((val :u8)) 291 ((v :lisp) 292 (idx :u32const)) 293 ()) 262 294 (strb val (:@ v (:$ (:apply + arm::misc-data-offset idx))))) 263 295 264 (define-arm-vinsn misc-set-u8 (((val :u8)) 265 ((v :lisp) 266 (scaled-idx :u32)) 267 ()) 296 (define-arm-vinsn (misc-set-u8 :predicatable) 297 (((val :u8)) 298 ((v :lisp) 299 (scaled-idx :u32)) 300 ()) 268 301 (strb val (:@ v scaled-idx))) 269 302 270 (define-arm-vinsn misc-ref-s8 (((dest :s8)) 271 ((v :lisp) 272 (scaled-idx :u32)) 273 ()) 303 (define-arm-vinsn (misc-ref-s8 :predicatable) 304 (((dest :s8)) 305 ((v :lisp) 306 (scaled-idx :u32)) 307 ()) 274 308 (ldrsb dest (:@ v scaled-idx))) 275 309 276 (define-arm-vinsn misc-ref-c-s8 (((dest :s8)) 277 ((v :lisp) 278 (idx :u32const)) 279 ()) 310 (define-arm-vinsn (misc-ref-c-s8 :predicatable) 311 (((dest :s8)) 312 ((v :lisp) 313 (idx :u32const)) 314 ()) 280 315 (ldrsb dest (:@ v (:$ (:apply + arm::misc-data-offset idx))))) 281 316 282 (define-arm-vinsn misc-set-c-s8 (((val :s8)) 283 ((v :lisp) 284 (idx :u32const)) 285 ()) 317 (define-arm-vinsn (misc-set-c-s8 :predicatable) 318 (((val :s8)) 319 ((v :lisp) 320 (idx :u32const)) 321 ()) 286 322 (strb val (:@ v (:$ (:apply + arm::misc-data-offset idx))))) 287 323 288 (define-arm-vinsn misc-set-s8 (((val :s8)) 289 ((v :lisp) 290 (scaled-idx :u32)) 291 ()) 324 (define-arm-vinsn (misc-set-s8 :predicatable) 325 (((val :s8)) 326 ((v :lisp) 327 (scaled-idx :u32)) 328 ()) 292 329 (strb val (:@ v scaled-idx))) 293 330 294 #+notyet 295 (define-arm-vinsn misc-ref-c-bit (((dest :u8))296 ((v :lisp)297 (idx :u32const))298 ())299 (lwz dest (:apply + arm::misc-data-offset (:apply ash idx -5)) v)300 ( rlwinm dest dest (:apply 1+ (:apply logand idx #x1f)) 31 31))301 302 #+notyet 303 (define-arm-vinsn misc-ref-c-bit-fixnum (((dest :imm)) 304 ((v :lisp)305 (idx :u32const))306 ((temp :u32)))307 (lwz temp (:apply + arm::misc-data-offset (:apply ash idx -5)) v)308 (rlwinm dest309 temp310 (:apply + 1 arm::fixnumshift (:apply logand idx #x1f))311 (- arm::least-significant-bit arm::fixnumshift)312 (- arm::least-significant-bit arm::fixnumshift))) 313 314 315 (define-arm-vinsn misc-ref-node(((dest :lisp))316 317 318 331 332 (define-arm-vinsn (misc-ref-c-bit :predicatable) 333 (((dest :u8)) 334 ((v :lisp) 335 (idx :u32const)) 336 ()) 337 (ldr dest (:@ v (:$ (:apply + arm::misc-data-offset (:apply ash idx -5))))) 338 (mov dest (:lsr dest (:$ (:apply logand idx #x1f)))) 339 (and dest dest (:$ 1))) 340 341 (define-arm-vinsn (misc-ref-c-bit-fixnum :predicatable) 342 (((dest :imm)) 343 ((v :lisp) 344 (idx :u32const)) 345 ((temp :u32))) 346 (ldr temp (:@ v (:$ (:apply + arm::misc-data-offset (:apply ash idx -5))))) 347 (mov temp (:ror temp (:$ (:apply logand #x1f (:apply - (:apply logand idx #x1f) arm::fixnumshift))))) 348 (and dest temp (:$ arm::fixnumone))) 349 350 351 (define-arm-vinsn (misc-ref-node :predicatable) 352 (((dest :lisp)) 353 ((v :lisp) 354 (scaled-idx :s32)) 355 ()) 319 356 (ldr dest (:@ v scaled-idx))) 320 357 321 358 322 323 324 (define-arm-vinsn misc-ref-c-node (((dest :lisp)) 325 ((v :lisp) 326 (idx :s16const)) 327 ()) 359 (define-arm-vinsn (misc-ref-c-node :predicatable) 360 (((dest :lisp)) 361 ((v :lisp) 362 (idx :s16const)) 363 ()) 328 364 (ldr dest (:@ v (:$ (:apply + arm::misc-data-offset (:apply ash idx 2)))))) 329 365 330 (define-arm-vinsn misc-set-node (() 331 ((val :lisp) 332 (v :lisp) 333 (scaled-idx :u32))) 366 (define-arm-vinsn (misc-set-node :predicatable) 367 (() 368 ((val :lisp) 369 (v :lisp) 370 (scaled-idx :u32))) 334 371 (str val (:@ v scaled-idx))) 335 372 336 373 ;;; This should only be used for initialization (when the value being 337 374 ;;; stored is known to be older than the vector V.) 338 (define-arm-vinsn misc-set-c-node (() 339 ((val :lisp) 340 (v :lisp) 341 (idx :s16const)) 342 ()) 375 (define-arm-vinsn (misc-set-c-node :predicatable) 376 (() 377 ((val :lisp) 378 (v :lisp) 379 (idx :s16const)) 380 ()) 343 381 (str val (:@ v (:$ (:apply + arm::misc-data-offset (:apply ash idx 2)))))) 344 382 345 383 346 (define-arm-vinsn misc-element-count-fixnum (((dest :imm)) 347 ((v :lisp)) 348 ((temp :u32))) 384 (define-arm-vinsn (misc-element-count-fixnum :predicatable) 385 (((dest :imm)) 386 ((v :lisp)) 387 ((temp :u32))) 349 388 (ldr temp (:@ v (:$ arm::misc-header-offset))) 350 389 (bic temp temp (:$ arm::subtag-mask)) … … 360 399 (uuo-error-vector-bounds (:? hs) idx v)) 361 400 362 (define-arm-vinsn 2d-unscaled-index (((dest :imm) 363 (dim1 :u32)) 364 ((dim1 :u32) 365 (i :imm) 366 (j :imm))) 401 (define-arm-vinsn (2d-unscaled-index :predicatable) 402 (((dest :imm) 403 (dim1 :u32)) 404 ((dim1 :u32) 405 (i :imm) 406 (j :imm))) 367 407 (mul dim1 i dim1) 368 408 (add dest dim1 j)) … … 370 410 ;; dest <- (+ (* i dim1 dim2) (* j dim2) k) 371 411 372 (define-arm-vinsn 3d-unscaled-index (((dest :imm) 373 (dim1 :u32) 374 (dim2 :u32)) 375 ((dim1 :u32) 376 (dim2 :u32) 377 (i :imm) 378 (j :imm) 379 (k :imm))) 412 (define-arm-vinsn (3d-unscaled-index :predicatable) 413 (((dest :imm) 414 (dim1 :u32) 415 (dim2 :u32)) 416 ((dim1 :u32) 417 (dim2 :u32) 418 (i :imm) 419 (j :imm) 420 (k :imm))) 380 421 (mul dim1 dim1 dim2) 381 422 (mul dim2 j dim2) … … 385 426 386 427 387 (define-arm-vinsn 2d-dim1 (((dest :u32)) 388 ((header :lisp))) 428 (define-arm-vinsn (2d-dim1 :predicatable) 429 (((dest :u32)) 430 ((header :lisp))) 389 431 (ldr dest (:@ header (:$ (+ arm::misc-data-offset (* 4 (1+ arm::arrayH.dim0-cell)))))) 390 432 (mov dest (:asr dest (:$ arm::fixnumshift)))) … … 392 434 393 435 394 (define-arm-vinsn 3d-dims (((dim1 :u32) 395 (dim2 :u32)) 396 ((header :lisp))) 436 (define-arm-vinsn (3d-dims :predicatable) 437 (((dim1 :u32) 438 (dim2 :u32)) 439 ((header :lisp))) 397 440 (ldr dim1 (:@ header (:$ (+ arm::misc-data-offset (* 4 (1+ arm::arrayH.dim0-cell)))))) 398 441 (ldr dim2 (:@ header (:$ (+ arm::misc-data-offset (* 4 (+ 2 arm::arrayH.dim0-cell)))))) … … 431 474 (mov dim2 (:asr dim2 (:$ arm::fixnumshift)))) 432 475 433 (define-arm-vinsn array-data-vector-ref (((dest :lisp)) 434 ((header :lisp))) 476 (define-arm-vinsn (array-data-vector-ref :predicatable) 477 (((dest :lisp)) 478 ((header :lisp))) 435 479 (ldr dest (:@ header (:$ arm::arrayH.data-vector)))) 436 480 … … 460 504 461 505 462 (define-arm-vinsn node-slot-ref (((dest :lisp)) 463 ((node :lisp) 464 (cellno :u32const))) 506 (define-arm-vinsn (node-slot-ref :predicatable) 507 (((dest :lisp)) 508 ((node :lisp) 509 (cellno :u32const))) 465 510 (ldr dest (:@ node (:$ (:apply + arm::misc-data-offset (:apply ash cellno 2)))))) 466 511 … … 479 524 ;;; Untagged memory reference & assignment. 480 525 481 (define-arm-vinsn mem-ref-c-fullword (((dest :u32)) 482 ((src :address) 483 (index :s16const))) 526 (define-arm-vinsn (mem-ref-c-fullword :predicatable) 527 (((dest :u32)) 528 ((src :address) 529 (index :s16const))) 484 530 (ldr dest (:@ src (:$ index)))) 485 531 486 532 487 (define-arm-vinsn mem-ref-c-signed-fullword (((dest :s32)) 488 ((src :address) 489 (index :s16const))) 533 (define-arm-vinsn (mem-ref-c-signed-fullword :predicatable) 534 (((dest :s32)) 535 ((src :address) 536 (index :s16const))) 490 537 (ldr dest (:@ src (:$ index)))) 491 538 492 (define-arm-vinsn mem-ref-c-natural (((dest :u32)) 493 ((src :address) 494 (index :s16const))) 539 540 (define-arm-vinsn (mem-ref-c-natural :predicatable) 541 (((dest :u32)) 542 ((src :address) 543 (index :s16const))) 495 544 (ldr dest (:@ src (:$ index)))) 496 545 497 546 498 (define-arm-vinsn mem-ref-fullword (((dest :u32)) 499 ((src :address) 500 (index :s32))) 547 (define-arm-vinsn (mem-ref-fullword :predicatable) 548 (((dest :u32)) 549 ((src :address) 550 (index :s32))) 501 551 (ldr dest (:@ src index))) 502 552 503 (define-arm-vinsn mem-ref-signed-fullword (((dest :u32)) 504 ((src :address) 505 (index :s32))) 553 (define-arm-vinsn (mem-ref-signed-fullword :predicatable) 554 (((dest :u32)) 555 ((src :address) 556 (index :s32))) 506 557 (ldr dest (:@ src index))) 507 558 508 (define-arm-vinsn mem-ref-natural (((dest :u32)) 509 ((src :address) 510 (index :s32))) 559 (define-arm-vinsn (mem-ref-natural :predicatable) 560 (((dest :u32)) 561 ((src :address) 562 (index :s32))) 511 563 (ldr dest (:@ src index))) 512 564 513 565 514 (define-arm-vinsn mem-ref-c-u16 (((dest :u16)) 515 ((src :address) 516 (index :s16const))) 566 (define-arm-vinsn (mem-ref-c-u16 :predicatable) 567 (((dest :u16)) 568 ((src :address) 569 (index :s16const))) 517 570 (ldrh dest (:@ src (:$ index)))) 518 571 519 572 520 (define-arm-vinsn mem-ref-u16 (((dest :u16)) 521 ((src :address) 522 (index :s32))) 573 (define-arm-vinsn (mem-ref-u16 :predicatable) 574 (((dest :u16)) 575 ((src :address) 576 (index :s32))) 523 577 (ldrh dest (:@ src index))) 524 578 525 579 526 580 527 (define-arm-vinsn mem-ref-c-s16 (((dest :s16)) 528 ((src :address) 529 (index :s16const))) 581 (define-arm-vinsn (mem-ref-c-s16 :predicatable) 582 (((dest :s16)) 583 ((src :address) 584 (index :s16const))) 530 585 (ldrsh dest (:@ src (:$ index)))) 531 586 532 (define-arm-vinsn mem-ref-s16 (((dest :s16)) 533 ((src :address) 534 (index :s32))) 587 (define-arm-vinsn (mem-ref-s16 :predicatable) 588 (((dest :s16)) 589 ((src :address) 590 (index :s32))) 535 591 (ldrsh dest (:@ src index))) 536 592 537 (define-arm-vinsn mem-ref-c-u8 (((dest :u8)) 538 ((src :address) 539 (index :s16const))) 593 (define-arm-vinsn (mem-ref-c-u8 :predicatable) 594 (((dest :u8)) 595 ((src :address) 596 (index :s16const))) 540 597 (ldrb dest (:@ src (:$ index)))) 541 598 542 (define-arm-vinsn mem-ref-u8 (((dest :u8)) 543 ((src :address) 544 (index :s32))) 599 (define-arm-vinsn (mem-ref-u8 :predicatable) 600 (((dest :u8)) 601 ((src :address) 602 (index :s32))) 545 603 (ldrb dest (:@ src index))) 546 604 547 (define-arm-vinsn mem-ref-c-s8 (((dest :s8)) 548 ((src :address) 549 (index :s16const))) 605 (define-arm-vinsn (mem-ref-c-s8 :predicatable) 606 (((dest :s8)) 607 ((src :address) 608 (index :s16const))) 550 609 (ldrsb dest (:@ src (:$ index)))) 551 610 552 (define-arm-vinsn mem-ref-s8 (((dest :s8)) 553 ((src :address) 554 (index :s32))) 611 (define-arm-vinsn (mem-ref-s8 :predicatable) 612 (((dest :s8)) 613 ((src :address) 614 (index :s32))) 555 615 (ldrsb dest (:@ src index))) 556 616 557 #+notyet 558 (define-arm-vinsn mem-ref-c-bit (((dest :u8)) 559 ((src :address) 560 (byte-index :s16const) 561 (bit-shift :u8const))) 562 (lbz dest byte-index src) 563 (rlwinm dest dest bit-shift 31 31)) 564 565 566 #+notyet 567 (define-arm-vinsn mem-ref-c-bit-fixnum (((dest :lisp)) 568 ((src :address) 569 (byte-index :s16const) 570 (bit-shift :u8const)) 571 ((byteval :u8))) 572 (lbz byteval byte-index src) 573 (rlwinm dest byteval bit-shift 29 29)) 574 575 (define-arm-vinsn mem-ref-bit (((dest :u8)) 576 ((src :address) 577 (bit-index :lisp)) 578 ((byte-index :s16) 579 (bit-shift :u8))) 617 (define-arm-vinsn (mem-ref-c-bit :predicatable) 618 (((dest :u8)) 619 ((src :address) 620 (byte-index :s16const) 621 (bit-shift :u8const))) 622 (ldrb dest (:@ src (:$ byte-index))) 623 (mov dest (:lsr dest (:$ bit-shift))) 624 (and dest dest (:$ 1))) 625 626 627 (define-arm-vinsn (mem-ref-c-bit-fixnum :predicatable) 628 (((dest :lisp)) 629 ((src :address) 630 (byte-index :s16const) 631 (bit-shift :u8const)) 632 ((byteval :u8))) 633 (ldrb byteval (:@ src (:$ byte-index))) 634 (mov byteval (:lsr byteval (:$ bit-shift))) 635 (and byteval byteval (:$ 1)) 636 (mov dest (:lsr byteval (:$ arm::fixnumshift)))) 637 638 (define-arm-vinsn (mem-ref-bit :predicatable) 639 (((dest :u8)) 640 ((src :address) 641 (bit-index :lisp)) 642 ((byte-index :s16) 643 (bit-shift :u8))) 580 644 581 645 (mov byte-index (:lsr bit-index (:$ arm::fixnumshift))) … … 586 650 587 651 588 (define-arm-vinsn mem-ref-bit-fixnum (((dest :lisp)) 589 ((src :address) 590 (bit-index :lisp)) 591 ((byte-index :s16) 592 (bit-shift :u8))) 652 (define-arm-vinsn (mem-ref-bit-fixnum :predicatable) 653 (((dest :lisp)) 654 ((src :address) 655 (bit-index :lisp)) 656 ((byte-index :s16) 657 (bit-shift :u8))) 593 658 (mov byte-index (:lsr bit-index (:$ arm::fixnumshift))) 594 659 (and bit-shift byte-index (:$ 7)) … … 598 663 (and dest dest (:lsl byte-index (:$ arm::fixnumshift)))) 599 664 600 (define-arm-vinsn mem-ref-c-double-float (((dest :double-float)) 601 ((src :address) 602 (index :s16const)) 603 ((low (:u32 #.arm::imm0)) 604 (high (:u32 #.arm::imm1)))) 665 (define-arm-vinsn (mem-ref-c-double-float :predicatable) 666 (((dest :double-float)) 667 ((src :address) 668 (index :s16const)) 669 ((low (:u32 #.arm::imm0)) 670 (high (:u32 #.arm::imm1)))) 605 671 (ldrd low (:@ src (:$ index))) 606 672 (fmdrr dest low high)) 607 673 608 (define-arm-vinsn mem-ref-double-float (((dest :double-float)) 609 ((src :address) 610 (index :s32)) 611 ((low (:u32 #.arm::imm0)) 612 (high (:u32 #.arm::imm1)))) 674 (define-arm-vinsn (mem-ref-double-float :predicatable) 675 (((dest :double-float)) 676 ((src :address) 677 (index :s32)) 678 ((low (:u32 #.arm::imm0)) 679 (high (:u32 #.arm::imm1)))) 613 680 (ldrd low (:@ src index)) 614 681 (fmdrr dest low high)) 615 682 616 (define-arm-vinsn mem-set-c-double-float (() 617 ((val :double-float) 618 (src :address) 619 (index :s16const)) 620 ((low (:u32 #.arm::imm0)) 621 (high (:u32 #.arm::imm1)))) 683 (define-arm-vinsn (mem-set-c-double-float :predicatable) 684 (() 685 ((val :double-float) 686 (src :address) 687 (index :s16const)) 688 ((low (:u32 #.arm::imm0)) 689 (high (:u32 #.arm::imm1)))) 622 690 (fmrrd low high src) 623 691 (strd low (:@ src (:$ index)))) 624 692 625 (define-arm-vinsn mem-set-double-float (() 626 ((val :double-float) 627 (src :address) 628 (index :s32)) ; imm2, I presume 629 ((low (:u32 #.arm::imm0)) 630 (high (:u32 #.arm::imm1)))) 693 (define-arm-vinsn (mem-set-double-float :predicatable) 694 (() 695 ((val :double-float) 696 (src :address) 697 (index :s32)) ; imm2, I presume 698 ((low (:u32 #.arm::imm0)) 699 (high (:u32 #.arm::imm1)))) 631 700 (fmrrd low high src) 632 701 (strd low (:@ src index))) 633 702 634 (define-arm-vinsn mem-ref-c-single-float (((dest :single-float)) 635 ((src :address) 636 (index :s16const)) 637 ((temp :u32))) 703 (define-arm-vinsn (mem-ref-c-single-float :predicatable) 704 (((dest :single-float)) 705 ((src :address) 706 (index :s16const)) 707 ((temp :u32))) 638 708 (ldr temp (:@ src (:$ index))) 639 709 (fmsr dest temp)) 640 710 641 (define-arm-vinsn mem-ref-single-float (((dest :single-float)) 642 ((src :address) 643 (index :s32)) 644 ((temp :u32))) 711 (define-arm-vinsn (mem-ref-single-float :predicatable) 712 (((dest :single-float)) 713 ((src :address) 714 (index :s32)) 715 ((temp :u32))) 645 716 (ldr temp (:@ src index)) 646 717 (fmsr dest temp)) 647 718 648 (define-arm-vinsn mem-set-c-single-float (() 649 ((val :single-float) 650 (src :address) 651 (index :s16const)) 652 ((temp :u32))) 719 (define-arm-vinsn (mem-set-c-single-float :predicatable) 720 (() 721 ((val :single-float) 722 (src :address) 723 (index :s16const)) 724 ((temp :u32))) 653 725 (fmrs temp src) 654 726 (str temp (:@ src (:$ index)))) 655 727 656 (define-arm-vinsn mem-set-single-float (() 657 ((val :single-float) 658 (src :address) 659 (index :s32)) 660 ((temp :u32))) 728 (define-arm-vinsn (mem-set-single-float :predicatable) 729 (() 730 ((val :single-float) 731 (src :address) 732 (index :s32)) 733 ((temp :u32))) 661 734 (fmrs temp src) 662 735 (str temp (:@ src (:$ index)))) 663 736 664 737 665 (define-arm-vinsn mem-set-c-address (() 666 ((val :address) 667 (src :address) 668 (index :s16const))) 738 (define-arm-vinsn (mem-set-c-address :predicatable) 739 (() 740 ((val :address) 741 (src :address) 742 (index :s16const))) 669 743 (str val (:@ src (:$ index)))) 670 744 671 (define-arm-vinsn mem-set-address (() 672 ((val :address) 673 (src :address) 674 (index :s32))) 745 (define-arm-vinsn (mem-set-address :predicatable) 746 (() 747 ((val :address) 748 (src :address) 749 (index :s32))) 675 750 (str val (:@ src index))) 676 751 677 (define-arm-vinsn mem-set-c-fullword (() 678 ((val :u32) 679 (src :address) 680 (index :s16const))) 752 (define-arm-vinsn (mem-set-c-fullword :predicatable) 753 (() 754 ((val :u32) 755 (src :address) 756 (index :s16const))) 681 757 (str val (:@ src (:$ index)))) 682 758 683 (define-arm-vinsn mem-set-fullword (() 684 ((val :u32) 685 (src :address) 686 (index :s32))) 759 (define-arm-vinsn (mem-set-fullword :predicatable) 760 (() 761 ((val :u32) 762 (src :address) 763 (index :s32))) 687 764 (str val (:@ src index))) 688 765 689 (define-arm-vinsn mem-set-c-halfword (() 690 ((val :u16) 691 (src :address) 692 (index :s16const))) 766 (define-arm-vinsn (mem-set-c-halfword :predicatable) 767 (() 768 ((val :u16) 769 (src :address) 770 (index :s16const))) 693 771 (strh val (:@ src (:$ index)))) 694 772 695 (define-arm-vinsn mem-set-halfword (() 696 ((val :u16) 697 (src :address) 698 (index :s32))) 773 (define-arm-vinsn (mem-set-halfword :predicatable) 774 (() 775 ((val :u16) 776 (src :address) 777 (index :s32))) 699 778 (strh val (:@ src index))) 700 779 701 (define-arm-vinsn mem-set-c-byte (() 702 ((val :u16) 703 (src :address) 704 (index :s16const))) 780 (define-arm-vinsn (mem-set-c-byte :predicatable) 781 (() 782 ((val :u16) 783 (src :address) 784 (index :s16const))) 705 785 (strb val (:@ src (:$ index)))) 706 786 707 (define-arm-vinsn mem-set-byte (() 708 ((val :u8) 709 (src :address) 710 (index :s32))) 787 (define-arm-vinsn (mem-set-byte :predicatable) 788 (() 789 ((val :u8) 790 (src :address) 791 (index :s32))) 711 792 (strb val (:@ src index))) 712 793 713 (define-arm-vinsn mem-set-c-bit-0 (() 714 ((src :address) 715 (byte-index :s16const) 716 (mask :u8const)) 717 ((val :u8))) 794 (define-arm-vinsn (mem-set-c-bit-0 :predicatable) 795 (() 796 ((src :address) 797 (byte-index :s16const) 798 (mask :u8const)) 799 ((val :u8))) 718 800 (ldrb val (:@ src (:$ byte-index))) 719 801 (bic val val (:$ mask)) … … 721 803 722 804 723 (define-arm-vinsn mem-set-c-bit-1 (() 724 ((src :address) 725 (byte-index :s16const) 726 (mask :u8const)) 727 ((val :u8))) 805 (define-arm-vinsn (mem-set-c-bit-1 :predicatable) 806 (() 807 ((src :address) 808 (byte-index :s16const) 809 (mask :u8const)) 810 ((val :u8))) 728 811 (ldrb val (:@ src (:$ byte-index))) 729 812 (orr val val (:$ mask)) … … 768 851 ;;; Tag and subtag extraction, comparison, checking, trapping ... 769 852 770 (define-arm-vinsn extract-tag (((tag :u8)) 771 ((object :lisp)) 772 ()) 853 (define-arm-vinsn (extract-tag :predicatable) 854 (((tag :u8)) 855 ((object :lisp)) 856 ()) 773 857 (and tag object (:$ arm::tagmask))) 774 858 775 (define-arm-vinsn extract-tag-fixnum (((tag :imm)) 776 ((object :lisp))) 859 (define-arm-vinsn (extract-tag-fixnum :predicatable) 860 (((tag :imm)) 861 ((object :lisp))) 777 862 (mov tag (:lsl object (:$ arm::fixnumshift))) 778 863 (and tag object (:$ (ash arm::tagmask arm::fixnumshift)))) 779 864 780 (define-arm-vinsn extract-fulltag (((tag :u8)) 781 ((object :lisp)) 782 ()) 865 (define-arm-vinsn (extract-fulltag :predicatable) 866 (((tag :u8)) 867 ((object :lisp)) 868 ()) 783 869 (and tag object (:$ arm::fulltagmask))) 784 870 785 871 786 (define-arm-vinsn extract-fulltag-fixnum (((tag :imm)) 787 ((object :lisp))) 872 (define-arm-vinsn (extract-fulltag-fixnum :predicatable) 873 (((tag :imm)) 874 ((object :lisp))) 788 875 (mov tag (:lsl object (:$ arm::fixnumshift))) 789 876 (and tag tag (:$ (ash arm::fulltagmask arm::fixnumshift)))) … … 1026 1113 1027 1114 1028 (define-arm-vinsn box-fixnum (((dest :imm)) 1029 ((src :s32))) 1115 (define-arm-vinsn (box-fixnum :predicatable) 1116 (((dest :imm)) 1117 ((src :s32))) 1030 1118 (mov dest (:lsl src (:$ arm::fixnumshift)))) 1031 1119 1032 (define-arm-vinsn fixnum->signed-natural (((dest :s32)) 1033 ((src :imm))) 1120 (define-arm-vinsn (fixnum->signed-natural :predicatable) 1121 (((dest :s32)) 1122 ((src :imm))) 1034 1123 (mov dest (:asr src (:$ arm::fixnumshift)))) 1035 1124 1036 (define-arm-vinsn fixnum->unsigned-natural (((dest :u32)) 1037 ((src :imm))) 1125 (define-arm-vinsn (fixnum->unsigned-natural :predicatable) 1126 (((dest :u32)) 1127 ((src :imm))) 1038 1128 (mov dest (:lsr src (:$ arm::fixnumshift)))) 1039 1129 … … 1115 1205 (uuo-error-reg-not-xtype (:? ne) src (:$ arm::xtype-u8))) 1116 1206 1117 (define-arm-vinsn %unbox-u8 (((dest :u8)) 1118 ((src :lisp))) 1207 (define-arm-vinsn (%unbox-u8 :predicatable) 1208 (((dest :u8)) 1209 ((src :lisp))) 1119 1210 (mov dest (:$ #xff)) 1120 1211 (and dest dest (:lsr src (:$ arm::fixnumshift)))) … … 1143 1234 1144 1235 1145 (define-arm-vinsn fixnum->double (((dest :double-float)) 1146 ((src :lisp)) 1147 ((imm :s32) 1148 (temp :single-float))) 1236 (define-arm-vinsn (fixnum->double :predicatable) 1237 (((dest :double-float)) 1238 ((src :lisp)) 1239 ((imm :s32) 1240 (temp :single-float))) 1149 1241 (mov imm (:asr src (:$ arm::fixnumshift))) 1150 1242 (fmsr temp imm) 1151 1243 (fsitod dest temp)) 1152 1244 1153 (define-arm-vinsn fixnum->single (((dest :single-float)) 1154 ((src :lisp)) 1155 ((imm :s32))) 1245 (define-arm-vinsn (fixnum->single :predicatable) 1246 (((dest :single-float)) 1247 ((src :lisp)) 1248 ((imm :s32))) 1156 1249 (mov imm (:asr src (:$ arm::fixnumshift))) 1157 1250 (fmsr dest imm) … … 1159 1252 1160 1253 1161 (define-arm-vinsn shift-left-variable-word (((dest :u32)) 1162 ((src :u32) 1163 (sh :u32))) 1254 (define-arm-vinsn (shift-left-variable-word :predicatable) 1255 (((dest :u32)) 1256 ((src :u32) 1257 (sh :u32))) 1164 1258 (mov dest (:lsl src sh))) 1165 1259 1166 (define-arm-vinsn u32logandc2 (((dest :u32)) 1167 ((x :u32) 1168 (y :u32))) 1260 (define-arm-vinsn (u32logandc2 :predicatable) 1261 (((dest :u32)) 1262 ((x :u32) 1263 (y :u32))) 1169 1264 (bic dest x y)) 1170 1265 1171 (define-arm-vinsn u32logior (((dest :u32)) 1172 ((x :u32) 1173 (y :u32))) 1266 (define-arm-vinsn (u32logior :predicatable) 1267 (((dest :u32)) 1268 ((x :u32) 1269 (y :u32))) 1174 1270 (orr dest x y)) 1175 1271 … … 1181 1277 (orreq dest src mask)) 1182 1278 1183 (define-arm-vinsn complement-shift-count (((dest :u32)) 1184 ((src :u32))) 1279 (define-arm-vinsn (complement-shift-count :predicatable) 1280 (((dest :u32)) 1281 ((src :u32))) 1185 1282 (rsb dest src (:$ 32))) 1186 1283 1187 (define-arm-vinsn extract-lowbyte (((dest :u32)) 1188 ((src :lisp))) 1284 (define-arm-vinsn (extract-lowbyte :predicatable) 1285 (((dest :u32)) 1286 ((src :lisp))) 1189 1287 (and dest src (:$ arm::subtag-mask))) 1190 1288 … … 1276 1374 (uuo-error-reg-not-xtype (:? ne) object (:$ tagval))) 1277 1375 1278 (define-arm-vinsn subtract-constant (((dest :imm)) 1279 ((src :imm) 1280 (const :s16const))) 1376 (define-arm-vinsn (subtract-constant :predicatable) 1377 (((dest :imm)) 1378 ((src :imm) 1379 (const :s16const))) 1281 1380 (sub dest src (:$ const))) 1282 1381 … … 1304 1403 1305 1404 1306 (define-arm-vinsn extract-variable-bit-fixnum (((dest :lisp)) 1307 ((src :u32) 1308 (bitnum :u8)) 1309 ((temp :u32))) 1405 (define-arm-vinsn (extract-variable-bit-fixnum :predicatable) 1406 (((dest :lisp)) 1407 ((src :u32) 1408 (bitnum :u8)) 1409 ((temp :u32))) 1310 1410 (mov temp (:lsr src bitnum)) 1311 1411 (mov dest (:$ arm::fixnumone)) … … 1429 1529 (orrne dest src (:$ (:apply ash 1 bitnum)))) 1430 1530 1431 (define-arm-vinsn set-constant-arm-bit-to-1 (((dest :u32)) 1432 ((src :u32) 1433 (bitnum :u8const))) 1531 (define-arm-vinsn (set-constant-arm-bit-to-1 :predicatable) 1532 (((dest :u32)) 1533 ((src :u32) 1534 (bitnum :u8const))) 1434 1535 (orr dest src (:$ (:apply ash 1 bitnum)))) 1435 1536 1436 1537 1437 (define-arm-vinsn set-constant-arm-bit-to-0 (((dest :u32)) 1438 ((src :u32) 1439 (bitnum :u8const))) 1538 (define-arm-vinsn (set-constant-arm-bit-to-0 :predicatable) 1539 (((dest :u32)) 1540 ((src :u32) 1541 (bitnum :u8const))) 1440 1542 (bic dest src (:$ (:apply ash 1 bitnum)))) 1441 1543 … … 1465 1567 ;;; Operations on lists and cons cells 1466 1568 1467 (define-arm-vinsn %cdr (((dest :lisp)) 1468 ((src :lisp))) 1569 (define-arm-vinsn (%cdr :predicatable) 1570 (((dest :lisp)) 1571 ((src :lisp))) 1469 1572 (ldr dest (:@ src (:$ arm::cons.cdr)))) 1470 1573 1471 (define-arm-vinsn %car (((dest :lisp)) 1472 ((src :lisp))) 1574 (define-arm-vinsn (%car :predicatable) 1575 (((dest :lisp)) 1576 ((src :lisp))) 1473 1577 (ldr dest (:@ src (:$ arm::cons.car)))) 1474 1578 1475 (define-arm-vinsn %set-car (() 1476 ((cell :lisp) 1477 (new :lisp))) 1579 (define-arm-vinsn (%set-car :predicatable) 1580 (() 1581 ((cell :lisp) 1582 (new :lisp))) 1478 1583 (str cell (:@ new (:$ arm::cons.car)))) 1479 1584 1480 (define-arm-vinsn %set-cdr (() 1481 ((cell :lisp) 1482 (new :lisp))) 1585 (define-arm-vinsn (%set-cdr :predicatable) 1586 (() 1587 ((cell :lisp) 1588 (new :lisp))) 1483 1589 (str cell (:@ new (:$ arm::cons.cdr)))) 1484 1590 1485 1591 1486 (define-arm-vinsn load-adl (() 1487 ((n :u32const))) 1592 (define-arm-vinsn (load-adl :predicatable) 1593 (() 1594 ((n :u32const))) 1488 1595 (mov nargs (:$ (:apply logand #x00ff0000 n))) 1489 1596 ((:not (:pred = 0 (:apply logand #xff000000 n))) … … 1494 1601 (orr nargs nargs (:$ (:apply logand #x000000ff n))))) 1495 1602 1496 (define-arm-vinsn set-nargs (() 1497 ((n :s16const))) 1603 (define-arm-vinsn (set-nargs :predicatable) 1604 (() 1605 ((n :s16const))) 1498 1606 (mov nargs (:$ (:apply ash n arm::word-shift)))) 1499 1607 1500 (define-arm-vinsn scale-nargs (() 1501 ((nfixed :s16const))) 1608 (define-arm-vinsn (scale-nargs :predicatable) 1609 (() 1610 ((nfixed :s16const))) 1502 1611 ((:pred > nfixed 0) 1503 1612 (add nargs nargs (:$ (:apply - (:apply ash nfixed arm::word-shift)))))) … … 1505 1614 1506 1615 1507 (define-arm-vinsn (vpush-register :push :node :vsp) 1616 (define-arm-vinsn (vpush-register :push :node :vsp :predicatable) 1617 1508 1618 (() 1509 1619 ((reg :lisp))) 1510 1620 (str reg (:@! vsp (:$ (- arm::node-size))))) 1511 1621 1512 (define-arm-vinsn (vpush-register-arg :push :node :vsp :outgoing-argument) 1622 (define-arm-vinsn (vpush-register-arg :push :node :vsp :outgoing-argument :predicatable) 1623 1513 1624 (() 1514 1625 ((reg :lisp))) 1515 1626 (str reg (:@! vsp (:$ (- arm::node-size))))) 1516 1627 1517 (define-arm-vinsn (vpush-xyz :push :node :vsp) (() ()) 1628 (define-arm-vinsn (vpush-xyz :push :node :vsp :predicatable) 1629 (() ()) 1518 1630 (stmdb (:! vsp) (arg_z arg_y arg_x))) 1519 1631 1520 (define-arm-vinsn (vpush-yz :push :node :vsp) (() ()) 1632 (define-arm-vinsn (vpush-yz :push :node :vsp :predicatable) 1633 (() ()) 1521 1634 (stmdb (:! vsp) (arg_z arg_y))) 1522 1635 … … 1540 1653 1541 1654 1542 (define-arm-vinsn (vpop-register :pop :node :vsp) 1655 (define-arm-vinsn (vpop-register :pop :node :vsp :predicatable) 1656 1543 1657 (((dest :lisp)) 1544 1658 ()) … … 1557 1671 1558 1672 1559 (define-arm-vinsn copy-node-gpr (((dest :lisp)) 1560 ((src :lisp))) 1673 (define-arm-vinsn (copy-node-gpr :predicatable) 1674 (((dest :lisp)) 1675 ((src :lisp))) 1561 1676 ((:not (:pred = 1562 1677 (:apply %hard-regspec-value dest) … … 1564 1679 (mov dest src))) 1565 1680 1566 (define-arm-vinsn copy-gpr (((dest t)) 1567 ((src t))) 1681 (define-arm-vinsn (copy-gpr :predicatable) 1682 (((dest t)) 1683 ((src t))) 1568 1684 ((:not (:pred = 1569 1685 (:apply %hard-regspec-value dest) … … 1572 1688 1573 1689 1574 (define-arm-vinsn copy-fpr (((dest :double-float)) 1575 ((src :double-float))) 1690 (define-arm-vinsn (double-to-double :predicatable) 1691 (((dest :double-float)) 1692 ((src :double-float))) 1576 1693 ((:not (:pred = 1577 1694 (:apply %hard-regspec-value dest) … … 1579 1696 (fcpyd dest src))) 1580 1697 1581 (define-arm-vinsn vcell-ref (((dest :lisp)) 1582 ((vcell :lisp))) 1698 (define-arm-vinsn (single-to-single :predicatable) 1699 (((dest :single-float)) 1700 ((src :single-float))) 1701 ((:not (:pred = 1702 (:apply %hard-regspec-value dest) 1703 (:apply %hard-regspec-value src))) 1704 (fcpys dest src))) 1705 1706 (define-arm-vinsn (vcell-ref :predicatable) 1707 (((dest :lisp)) 1708 ((vcell :lisp))) 1583 1709 (ldr dest (:@ vcell (:$ arm::misc-data-offset)))) 1584 1710 … … 1598 1724 (str closed (:@ dest (:$ arm::value-cell.value)))) 1599 1725 1600 (define-arm-vinsn make-stack-vcell (((dest :lisp)) 1601 ((closed :lisp)) 1602 ((header :u32))) 1726 (define-arm-vinsn (make-stack-vcell :predicatable) 1727 (((dest :lisp)) 1728 ((closed :lisp)) 1729 ((header :u32))) 1603 1730 (mov header (:$ arm::subtag-value-cell)) 1604 1731 (orr header header (:$ (ash arm::value-cell.element-count arm::num-subtag-bits))) … … 1606 1733 (add dest sp (:$ arm::fulltag-misc))) 1607 1734 1608 (define-arm-vinsn make-stack-cons (((dest :lisp)) 1609 ((car :lisp) (cdr :lisp)) 1610 ((header (:u32 #.arm::imm0)) 1611 (zero (:u32 #.arm::imm1)))) 1735 (define-arm-vinsn (make-stack-cons :predicatable) 1736 (((dest :lisp)) 1737 ((car :lisp) (cdr :lisp)) 1738 ((header (:u32 #.arm::imm0)) 1739 (zero (:u32 #.arm::imm1)))) 1612 1740 (mov header (:$ arm::subtag-simple-vector)) 1613 1741 (mov zero (:$ 0)) … … 1626 1754 1627 1755 1628 (define-arm-vinsn %closure-code% (((dest :lisp)) 1629 ()) 1756 (define-arm-vinsn (%closure-code% :predicatable) 1757 (((dest :lisp)) 1758 ()) 1630 1759 (mov dest (:$ arm::nil-value)) 1631 1760 (ldr dest (:@ dest (:$ (:apply + arm::symbol.vcell (arm::nrs-offset %closure-code%)))))) 1632 1761 1633 1762 1634 (define-arm-vinsn single-float-bits (((dest :u32)) 1635 ((src :lisp))) 1763 (define-arm-vinsn (single-float-bits :predicatable) 1764 (((dest :u32)) 1765 ((src :lisp))) 1636 1766 (ldr dest (:@ src (:$ arm::single-float.value)))) 1637 1767 … … 1670 1800 1671 1801 1672 (define-arm-vinsn ref-interrupt-level (((dest :imm)) 1673 () 1674 ((temp :u32))) 1802 (define-arm-vinsn (ref-interrupt-level :predicatable) 1803 (((dest :imm)) 1804 () 1805 ((temp :u32))) 1675 1806 (ldr temp (:@ rcontext (:$ arm::tcr.tlb-pointer))) 1676 1807 (ldr dest (:@ temp (:$ arm::INTERRUPT-LEVEL-BINDING-INDEX)))) … … 1678 1809 1679 1810 ;;; Unconditional (pc-relative) branch 1680 (define-arm-vinsn (jump :jump) (() 1681 ((label :label))) 1811 (define-arm-vinsn (jump :jump :predicatable) 1812 (() 1813 ((label :label))) 1682 1814 (b label)) 1683 1815 … … 1712 1844 1713 1845 1714 (define-arm-vinsn lisp-word-ref (((dest t)) 1715 ((base t) 1716 (offset t))) 1846 (define-arm-vinsn (lisp-word-ref :predicatable) 1847 (((dest t)) 1848 ((base t) 1849 (offset t))) 1717 1850 (ldr dest (:@ base offset))) 1718 1851 1719 (define-arm-vinsn lisp-word-ref-c (((dest t)) 1720 ((base t) 1721 (offset :s16const))) 1852 (define-arm-vinsn (lisp-word-ref-c :predicatable) 1853 (((dest t)) 1854 ((base t) 1855 (offset :s16const))) 1722 1856 (ldr dest (:@ base (:$ offset)))) 1723 1857 … … 1725 1859 1726 1860 ;; Load an unsigned, 32-bit constant into a destination register. 1727 (define-arm-vinsn (lri :constant-ref) (((dest :imm)) 1728 ((intval :u32const)) 1729 ()) 1861 (define-arm-vinsn (lri :constant-ref :predicatable) 1862 (((dest :imm)) 1863 ((intval :u32const)) 1864 ()) 1730 1865 ((:pred arm::encode-arm-immediate intval) 1731 1866 (mov dest (:$ intval))) … … 1751 1886 1752 1887 1753 (define-arm-vinsn alloc-eabi-c-frame (() 1754 ((n-c-args :u16const)) 1755 ((header :u32) 1756 (size :imm) 1757 (prevsp :imm))) 1888 (define-arm-vinsn (alloc-eabi-c-frame :predicatable) 1889 (() 1890 ((n-c-args :u16const)) 1891 ((header :u32) 1892 (size :imm) 1893 (prevsp :imm))) 1758 1894 (mov header (:$ (:apply ash (:apply + 1 (:apply logandc2 (:apply + 4 4 1 n-c-args) 1)) arm::num-subtag-bits))) 1759 1895 (mov size (:lsr header (:$ (- arm::num-subtag-bits arm::word-shift)))) … … 1764 1900 (str prevsp (:@ sp (:$ 4)))) 1765 1901 1766 (define-arm-vinsn alloc-variable-c-frame (() 1767 ((n-c-args :lisp)) 1768 ((header :u32) 1769 (size :imm) 1770 (prevsp :imm))) 1902 (define-arm-vinsn (alloc-variable-c-frame :predicatable) 1903 (() 1904 ((n-c-args :lisp)) 1905 ((header :u32) 1906 (size :imm) 1907 (prevsp :imm))) 1771 1908 (add size n-c-args (:$ (ash (+ 4 1) arm::word-shift))) 1772 1909 (bic size size (:$ arm::fixnumone)) … … 1785 1922 ;;; might as well exploit the fact that we stored the previous sp at 1786 1923 ;;; offset 4 in the C frame. 1787 (define-arm-vinsn (discard-c-frame :csp :pop :discard) (() 1788 ()) 1924 (define-arm-vinsn (discard-c-frame :csp :pop :discard :predicatable) 1925 (() 1926 ()) 1789 1927 (ldr sp (:@ sp (:$ 4)))) 1790 1928 1791 1929 1792 (define-arm-vinsn gpr-to-single-float (((dest :single-float)) 1793 ((src :u32))) 1930 (define-arm-vinsn (gpr-to-single-float :predicatable) 1931 (((dest :single-float)) 1932 ((src :u32))) 1794 1933 (fmsr dest src)) 1795 1934 1796 (define-arm-vinsn gpr-pair-to-double-float (((dest :double-float)) 1797 ((low :u32) 1798 (high :u32))) 1935 (define-arm-vinsn (gpr-pair-to-double-float :predicatable) 1936 (((dest :double-float)) 1937 ((low :u32) 1938 (high :u32))) 1799 1939 (fmdrr dest low high)) 1800 1940 1801 1941 1802 (define-arm-vinsn set-eabi-c-arg (() 1803 ((argval :u32) 1804 (argnum :u16const))) 1942 (define-arm-vinsn (set-eabi-c-arg :predicatable) 1943 (() 1944 ((argval :u32) 1945 (argnum :u16const))) 1805 1946 (str argval (:@ sp (:$ (:apply + arm::dnode-size (:apply ash argnum arm::word-shift)))))) 1806 1947 1807 1948 1808 (define-arm-vinsn set-single-eabi-c-arg (() 1809 ((argval :single-float) 1810 (argnum :u16const))) 1949 (define-arm-vinsn (set-single-eabi-c-arg :predicatable) 1950 (() 1951 ((argval :single-float) 1952 (argnum :u16const))) 1811 1953 (fsts argval (:@ sp (:$ (:apply + arm::dnode-size (:apply ash argnum arm::word-shift)))))) 1812 1954 1813 (define-arm-vinsn set-double-eabi-c-arg (() 1814 ((argval :double-float) 1815 (argnum :u16const))) 1955 (define-arm-vinsn (set-double-eabi-c-arg :predicatable) 1956 (() 1957 ((argval :double-float) 1958 (argnum :u16const))) 1816 1959 (fstd argval (:@ sp (:$ (:apply + arm::dnode-size (:apply ash argnum arm::word-shift)))))) 1817 1960 1818 1961 1819 1962 1820 (define-arm-vinsn (load-nil :constant-ref) (((dest t)) 1821 ()) 1963 (define-arm-vinsn (load-nil :constant-ref :predicatable) 1964 (((dest t)) 1965 ()) 1822 1966 (mov dest (:$ arm::nil-value))) 1823 1967 1824 (define-arm-vinsn (load-t :constant-ref) (((dest t)) 1825 ()) 1968 (define-arm-vinsn (load-t :constant-ref :predicatable) 1969 (((dest t)) 1970 ()) 1826 1971 (mov dest (:$ arm::nil-value)) 1827 1972 (add dest dest (:$ arm::t-offset))) … … 1829 1974 1830 1975 1831 (define-arm-vinsn (ref-constant :constant-ref) (((dest :lisp)) 1832 ((src :s16const))) 1976 (define-arm-vinsn (ref-constant :constant-ref :predicatable) 1977 (((dest :lisp)) 1978 ((src :s16const))) 1833 1979 (ldr dest (:@ fn (:$ (:apply + arm::misc-data-offset (:apply ash (:apply + src 2) 2)))))) 1834 1980 1835 (define-arm-vinsn ref-indexed-constant (((dest :lisp)) 1836 ((idxreg :s32))) 1981 (define-arm-vinsn (ref-indexed-constant :predicatable) 1982 (((dest :lisp)) 1983 ((idxreg :s32))) 1837 1984 (ldr dest (:@ arm::fn idxreg))) 1838 1985 … … 1915 2062 (bic allocptr allocptr (:$ arm::fulltagmask))) 1916 2063 1917 (define-arm-vinsn (vstack-discard :vsp :pop :discard) (() 1918 ((nwords :u32const))) 2064 (define-arm-vinsn (vstack-discard :vsp :pop :discard :predicatable) 2065 (() 2066 ((nwords :u32const))) 1919 2067 ((:not (:pred = nwords 0)) 1920 2068 (add vsp vsp (:$ (:apply ash nwords arm::word-shift))))) 1921 2069 1922 2070 1923 (define-arm-vinsn lcell-load (((dest :lisp)) 1924 ((cell :lcell) 1925 (top :lcell))) 2071 (define-arm-vinsn (lcell-load :predicatable) 2072 (((dest :lisp)) 2073 ((cell :lcell) 2074 (top :lcell))) 1926 2075 (ldr dest (:@ vsp (:$ (:apply - 1927 (:apply - (:apply calc-lcell-depth top) 4) 1928 (:apply calc-lcell-offset cell)))))) 1929 1930 (define-arm-vinsn vframe-load (((dest :lisp)) 1931 ((frame-offset :u16const) 1932 (cur-vsp :u16const))) 2076 (:apply - (:apply calc-lcell-depth top) 4) 2077 (:apply calc-lcell-offset cell)))))) 2078 2079 (define-arm-vinsn (vframe-load :predicatable) 2080 (((dest :lisp)) 2081 ((frame-offset :u16const) 2082 (cur-vsp :u16const))) 1933 2083 (ldr dest (:@ vsp (:$ (:apply - (:apply - cur-vsp 4) frame-offset))))) 1934 2084 1935 (define-arm-vinsn lcell-store (() 1936 ((src :lisp) 1937 (cell :lcell) 1938 (top :lcell))) 2085 (define-arm-vinsn (lcell-store :predicatable) 2086 (() 2087 ((src :lisp) 2088 (cell :lcell) 2089 (top :lcell))) 1939 2090 (str src (:@ vsp (:$ (:apply - 1940 (:apply - (:apply calc-lcell-depth top) 4) 1941 (:apply calc-lcell-offset cell)))))) 1942 1943 (define-arm-vinsn vframe-store (() 1944 ((src :lisp) 1945 (frame-offset :u16const) 1946 (cur-vsp :u16const))) 2091 (:apply - (:apply calc-lcell-depth top) 4) 2092 (:apply calc-lcell-offset cell)))))) 2093 2094 (define-arm-vinsn (vframe-store :predicatable) 2095 (() 2096 ((src :lisp) 2097 (frame-offset :u16const) 2098 (cur-vsp :u16const))) 1947 2099 (str src (:@ vsp (:$ (:apply - (:apply - cur-vsp 4) frame-offset))))) 1948 2100 1949 (define-arm-vinsn load-vframe-address (((dest :imm)) 1950 ((offset :s16const))) 2101 (define-arm-vinsn (load-vframe-address :predicatable) 2102 (((dest :imm)) 2103 ((offset :s16const))) 1951 2104 (add dest vsp (:$ offset))) 1952 2105 1953 (define-arm-vinsn copy-lexpr-argument (() 1954 () 1955 ((temp :lisp))) 2106 (define-arm-vinsn (copy-lexpr-argument :predicatable) 2107 (() 2108 () 2109 ((temp :lisp))) 1956 2110 (ldr temp (:@ vsp nargs)) 1957 2111 (str temp (:@! vsp (:$ (- arm::node-size))))) … … 1960 2114 1961 2115 ;;; Treat the low 8 bits of VAL as an unsigned integer; set RESULT to the equivalent fixnum. 1962 (define-arm-vinsn u8->fixnum (((result :imm)) 1963 ((val :u8)) 1964 ()) 2116 (define-arm-vinsn (u8->fixnum :predicatable) 2117 (((result :imm)) 2118 ((val :u8)) 2119 ()) 1965 2120 (mov result (:lsl val (:$ 24))) 1966 2121 (mov result (:lsr result (:$ (- 24 arm::fixnumshift))))) 1967 2122 1968 2123 ;;; Treat the low 8 bits of VAL as a signed integer; set RESULT to the equivalent fixnum. 1969 (define-arm-vinsn s8->fixnum (((result :imm)) 1970 ((val :s8)) 1971 ()) 2124 (define-arm-vinsn (s8->fixnum :predicatable) 2125 (((result :imm)) 2126 ((val :s8)) 2127 ()) 1972 2128 (mov result (:lsr val (:$ 24))) 1973 2129 (mov result (:asr val (:$ (- 24 arm::fixnumshift))))) … … 1975 2131 1976 2132 ;;; Treat the low 16 bits of VAL as an unsigned integer; set RESULT to the equivalent fixnum. 1977 (define-arm-vinsn u16->fixnum (((result :imm)) 1978 ((val :u16)) 1979 ()) 2133 (define-arm-vinsn (u16->fixnum :predicatable) 2134 (((result :imm)) 2135 ((val :u16)) 2136 ()) 1980 2137 (mov result (:lsl val (:$ 16))) 1981 2138 (mov result (:lsr result (:$ (- 16 arm::fixnumshift))))) 1982 2139 1983 2140 ;;; Treat the low 16 bits of VAL as a signed integer; set RESULT to the equivalent fixnum. 1984 (define-arm-vinsn s16->fixnum (((result :imm)) 1985 ((val :s16)) 1986 ()) 2141 (define-arm-vinsn (s16->fixnum :predicatable) 2142 (((result :imm)) 2143 ((val :s16)) 2144 ()) 1987 2145 (mov result (:lsl val (:$ 16))) 1988 2146 (mov result (:asr result (:$ (- 16 arm::fixnumshift))))) 1989 2147 1990 (define-arm-vinsn fixnum->s16 (((result :s16)) 1991 ((src :imm))) 2148 (define-arm-vinsn (fixnum->s16 :predicatable) 2149 (((result :s16)) 2150 ((src :imm))) 1992 2151 (mov result (:asr src (:$ arm::fixnumshift)))) 1993 2152 … … 2038 2197 :done) 2039 2198 2040 (define-arm-vinsn u16->u32 (((dest :u32)) 2041 ((src :u16))) 2199 (define-arm-vinsn (u16->u32 :predicatable) 2200 (((dest :u32)) 2201 ((src :u16))) 2042 2202 (mov dest (:$ #xff)) 2043 2203 (orr dest dest (:$ #xff00)) 2044 2204 (and dest dest src)) 2045 2205 2046 (define-arm-vinsn u8->u32 (((dest :u32)) 2047 ((src :u8))) 2206 (define-arm-vinsn (u8->u32 :predicatable) 2207 (((dest :u32)) 2208 ((src :u8))) 2048 2209 (and dest src (:$ #xff))) 2049 2210 2050 2211 2051 (define-arm-vinsn s16->s32 (((dest :s32)) 2052 ((src :s16))) 2212 (define-arm-vinsn (s16->s32 :predicatable) 2213 (((dest :s32)) 2214 ((src :s16))) 2053 2215 (mov dest (:lsl src (:$ 16))) 2054 2216 (mov dest (:asr src (:$ 16)))) 2055 2217 2056 (define-arm-vinsn s8->s32 (((dest :s32)) 2057 ((src :s8))) 2218 (define-arm-vinsn (s8->s32 :predicatable) 2219 (((dest :s32)) 2220 ((src :s8))) 2058 2221 (mov dest (:lsl src (:$ 24))) 2059 2222 (mov dest (:asr src (:$ 24)))) … … 2103 2266 2104 2267 ;;; "dest" is preallocated, presumably on a stack somewhere. 2105 (define-arm-vinsn store-double (() 2106 ((dest :lisp) 2107 (source :double-float)) 2108 ((low (:u32 #.arm::imm0)) 2109 (high (:u32 #.arm::imm1)))) 2268 (define-arm-vinsn (store-double :predicatable) 2269 (() 2270 ((dest :lisp) 2271 (source :double-float)) 2272 ((low (:u32 #.arm::imm0)) 2273 (high (:u32 #.arm::imm1)))) 2110 2274 (fmrrd low high source) 2111 2275 (str low (:@ dest (:$ arm::double-float.value)))) 2112 2276 2113 (define-arm-vinsn get-double (((target :double-float)) 2114 ((source :lisp)) 2115 ((low (:u32 #.arm::imm0)) 2116 (high (:u32 #.arm::imm1)))) 2277 (define-arm-vinsn (get-double :predicatable) 2278 (((target :double-float)) 2279 ((source :lisp)) 2280 ((low (:u32 #.arm::imm0)) 2281 (high (:u32 #.arm::imm1)))) 2117 2282 (ldrd low (:@ source (:$ arm::double-float.value))) 2118 2283 (fmdrr target low high)) … … 2139 2304 (fcvtsd result arg)) 2140 2305 2141 (define-arm-vinsn store-single (() 2142 ((dest :lisp) 2143 (source :single-float)) 2144 ((temp :u32))) 2306 (define-arm-vinsn double-to-single (((result :double-float)) 2307 ((arg :single-float))) 2308 (fcvtds result arg)) 2309 2310 (define-arm-vinsn (store-single :predicatable) 2311 (() 2312 ((dest :lisp) 2313 (source :single-float)) 2314 ((temp :u32))) 2145 2315 (fmrs temp source) 2146 2316 (str temp (:@ dest (:$ arm::single-float.value)))) 2147 2317 2148 (define-arm-vinsn get-single (((target :single-float)) 2149 ((source :lisp)) 2150 ((temp :u32))) 2318 (define-arm-vinsn (get-single :predicatable) 2319 (((target :single-float)) 2320 ((source :lisp)) 2321 ((temp :u32))) 2151 2322 (ldr temp (:@ source (:$ arm::single-float.value))) 2152 2323 (fmsr target temp)) … … 2155 2326 2156 2327 2157 (define-arm-vinsn character->fixnum (((dest :lisp)) 2158 ((src :lisp)) 2159 ()) 2328 (define-arm-vinsn (character->fixnum :predicatable) 2329 (((dest :lisp)) 2330 ((src :lisp)) 2331 ()) 2160 2332 (bic dest src (:$ arm::subtag-mask)) 2161 2333 (mov dest (:lsr dest (:$ (- arm::charcode-shift arm::fixnumshift))))) 2162 2334 2163 (define-arm-vinsn character->code (((dest :u32)) 2164 ((src :lisp))) 2335 (define-arm-vinsn (character->code :predicatable) 2336 (((dest :u32)) 2337 ((src :lisp))) 2165 2338 (mov dest (:lsr src (:$ arm::charcode-shift)))) 2166 2339 … … 2183 2356 2184 2357 ;;; src is known to be a code for which CODE-CHAR returns non-nil. 2185 (define-arm-vinsn code-char->char (((dest :lisp)) 2186 ((src :imm)) 2187 ()) 2358 (define-arm-vinsn (code-char->char :predicatable) 2359 (((dest :lisp)) 2360 ((src :imm)) 2361 ()) 2188 2362 (mov dest (:lsl src (:$ (- arm::charcode-shift arm::fixnum-shift)))) 2189 2363 (orr dest dest (:$ arm::subtag-character))) 2190 2364 2191 (define-arm-vinsn u32->char (((dest :lisp)) 2192 ((src :u32)) 2193 ()) 2365 (define-arm-vinsn (u32->char :predicatable) 2366 (((dest :lisp)) 2367 ((src :u32)) 2368 ()) 2194 2369 (mov dest (:lsl src (:$ arm::charcode-shift))) 2195 2370 (orr dest dest (:$ arm::subtag-character))) … … 2197 2372 ;; ... Macptrs ... 2198 2373 2199 (define-arm-vinsn deref-macptr (((addr :address)) 2200 ((src :lisp)) 2201 ()) 2374 (define-arm-vinsn (deref-macptr :predicatable) 2375 (((addr :address)) 2376 ((src :lisp)) 2377 ()) 2202 2378 (ldr addr (:@ src (:$ arm::macptr.address)))) 2203 2379 2204 (define-arm-vinsn set-macptr-address (() 2205 ((addr :address) 2206 (src :lisp)) 2207 ()) 2380 (define-arm-vinsn (set-macptr-address :predicatable) 2381 (() 2382 ((addr :address) 2383 (src :lisp)) 2384 ()) 2208 2385 (str addr (:@ src (:$ arm::macptr.address)))) 2209 2386 … … 2225 2402 (str address (:@ dest (:$ arm::macptr.address)))) 2226 2403 2227 (define-arm-vinsn macptr->stack (((dest :lisp)) 2228 ((address :address)) 2229 ((header :u32))) 2404 (define-arm-vinsn (macptr->stack :predicatable) 2405 (((dest :lisp)) 2406 ((address :address)) 2407 ((header :u32))) 2230 2408 (mov header (:$ arm::subtag-macptr)) 2231 2409 (orr header header (:$ (ash arm::macptr.element-count arm::num-subtag-bits))) … … 2239 2417 2240 2418 2241 (define-arm-vinsn adjust-stack-register (() 2242 ((reg t) 2243 (amount :s16const))) 2419 (define-arm-vinsn (adjust-stack-register :predicatable) 2420 (() 2421 ((reg t) 2422 (amount :s16const))) 2244 2423 (add reg reg (:$ amount))) 2245 2424 2246 (define-arm-vinsn adjust-vsp (() 2247 ((amount :s16const))) 2425 (define-arm-vinsn (adjust-vsp :predicatable) 2426 (() 2427 ((amount :s16const))) 2248 2428 (add vsp vsp (:$ amount))) 2249 2429 2250 (define-arm-vinsn adjust-sp (() 2251 ((amount :s16const))) 2430 (define-arm-vinsn (adjust-sp :predicatable) 2431 (() 2432 ((amount :s16const))) 2252 2433 (add sp sp (:$ amount))) 2253 2434 2254 2435 ;; Arithmetic on fixnums & unboxed numbers 2255 2436 2256 (define-arm-vinsn u32-lognot (((dest :u32)) 2257 ((src :u32)) 2258 ()) 2437 (define-arm-vinsn (u32-lognot :predicatable) 2438 (((dest :u32)) 2439 ((src :u32)) 2440 ()) 2259 2441 (mvn dest src)) 2260 2442 2261 (define-arm-vinsn fixnum-lognot (((dest :imm)) 2262 ((src :imm)) 2263 ((temp :u32))) 2443 (define-arm-vinsn (fixnum-lognot :predicatable) 2444 (((dest :imm)) 2445 ((src :imm)) 2446 ((temp :u32))) 2264 2447 (mvn temp src) 2265 2448 (bic dest temp (:$ arm::fixnummask))) … … 2294 2477 2295 2478 2296 (define-arm-vinsn negate-fixnum-no-ovf (((dest :lisp)) 2297 ((src :imm))) 2479 (define-arm-vinsn (negate-fixnum-no-ovf :predicatable) 2480 (((dest :lisp)) 2481 ((src :imm))) 2298 2482 2299 2483 (rsb dest src (:$ 0))) 2300 2484 2301 2485 2302 (define-arm-vinsn logior-immediate (((dest :imm)) 2303 ((src :imm) 2304 (imm :u32const))) 2486 (define-arm-vinsn (logior-immediate :predicatable) 2487 (((dest :imm)) 2488 ((src :imm) 2489 (imm :u32const))) 2305 2490 (orr dest src (:$ imm))) 2306 2491 2307 2492 2308 2493 2309 (define-arm-vinsn %logior2 (((dest :imm)) 2310 ((x :imm) 2311 (y :imm)) 2312 ()) 2494 (define-arm-vinsn (%logior2 :predicatable) 2495 (((dest :imm)) 2496 ((x :imm) 2497 (y :imm)) 2498 ()) 2313 2499 (orr dest x y)) 2314 2500 2315 (define-arm-vinsn logand-immediate (((dest :imm)) 2316 ((src :imm) 2317 (imm :u32const))) 2501 (define-arm-vinsn (logand-immediate :predicatable) 2502 (((dest :imm)) 2503 ((src :imm) 2504 (imm :u32const))) 2318 2505 (and dest src (:$ imm))) 2319 2506 2320 2507 2321 (define-arm-vinsn %logand2 (((dest :imm)) 2322 ((x :imm) 2323 (y :imm)) 2324 ()) 2508 (define-arm-vinsn (%logand2 :predicatable) 2509 (((dest :imm)) 2510 ((x :imm) 2511 (y :imm)) 2512 ()) 2325 2513 (and dest x y)) 2326 2514 2327 (define-arm-vinsn logxor-immediate (((dest :imm)) 2328 ((src :imm) 2329 (imm :u32const))) 2515 (define-arm-vinsn (logxor-immediate :predicatable) 2516 (((dest :imm)) 2517 ((src :imm) 2518 (imm :u32const))) 2330 2519 (eor dest src (:$ imm))) 2331 2520 … … 2333 2522 2334 2523 2335 (define-arm-vinsn %logxor2 (((dest :imm)) 2336 ((x :imm) 2337 (y :imm)) 2338 ()) 2524 (define-arm-vinsn (%logxor2 :predicatable) 2525 (((dest :imm)) 2526 ((x :imm) 2527 (y :imm)) 2528 ()) 2339 2529 (eor dest x y)) 2340 2530 2341 2531 ;;; ARM register shifts shift by the low byte of RS. 2342 (define-arm-vinsn %ilsl (((dest :imm)) 2343 ((count :imm) 2344 (src :imm)) 2345 ((temp :u32))) 2532 (define-arm-vinsn (%ilsl :predicatable) 2533 (((dest :imm)) 2534 ((count :imm) 2535 (src :imm)) 2536 ((temp :u32))) 2346 2537 (mov temp (:asr count (:$ arm::fixnumshift))) 2347 2538 (mov dest (:lsl src temp))) 2348 2539 2349 2540 ;;; Shift by a constant = -> shift by 32. Don't do that. 2350 (define-arm-vinsn %ilsl-c (((dest :imm)) 2351 ((count :u8const) 2352 (src :imm))) 2541 (define-arm-vinsn (%ilsl-c :predicatable) 2542 (((dest :imm)) 2543 ((count :u8const) 2544 (src :imm))) 2353 2545 ((:pred = count 0) 2354 2546 (mov dest src)) … … 2357 2549 2358 2550 2359 (define-arm-vinsn %ilsr-c (((dest :imm)) 2360 ((count :u8const) 2361 (src :imm)) 2362 ((temp :s32))) 2551 (define-arm-vinsn (%ilsr-c :predicatable) 2552 (((dest :imm)) 2553 ((count :u8const) 2554 (src :imm)) 2555 ((temp :s32))) 2363 2556 (mov temp (:lsr src (:$ count))) 2364 2557 (bic dest temp (:$ arm::fixnummask))) 2365 2558 2366 2559 2367 (define-arm-vinsn %iasr (((dest :imm)) 2368 ((count :imm) 2369 (src :imm)) 2370 ((temp :s32))) 2560 (define-arm-vinsn (%iasr :predicatable) 2561 (((dest :imm)) 2562 ((count :imm) 2563 (src :imm)) 2564 ((temp :s32))) 2371 2565 (mov temp (:asr count (:$ arm::fixnumshift))) 2372 2566 (mov temp (:asr src temp)) … … 2383 2577 (bic dest temp (:$ arm::fixnummask)))) 2384 2578 2385 (define-arm-vinsn %ilsr (((dest :imm)) 2386 ((count :imm) 2387 (src :imm)) 2388 ((temp :s32))) 2579 (define-arm-vinsn (%ilsr :predicatable) 2580 (((dest :imm)) 2581 ((count :imm) 2582 (src :imm)) 2583 ((temp :s32))) 2389 2584 (mov temp (:asr count (:$ arm::fixnumshift))) 2390 2585 (mov temp (:lsr src temp)) … … 2392 2587 2393 2588 2394 (define-arm-vinsn %ilsr-c (((dest :imm)) 2395 ((count :u8const) 2396 (src :imm)) 2397 ((temp :s32))) 2589 (define-arm-vinsn (%ilsr-c :predicatable) 2590 (((dest :imm)) 2591 ((count :u8const) 2592 (src :imm)) 2593 ((temp :s32))) 2398 2594 ((:pred = count 0) 2399 2595 (mov dest src)) … … 2402 2598 (bic dest temp (:$ arm::fixnummask)))) 2403 2599 2404 (define-arm-vinsn natural-shift-left (((dest :u32)) 2405 ((src :u32) 2406 (count :u8const))) 2600 (define-arm-vinsn (natural-shift-left :predicatable) 2601 (((dest :u32)) 2602 ((src :u32) 2603 (count :u8const))) 2407 2604 ((:pred = count 0) 2408 2605 (mov dest src)) … … 2410 2607 (mov dest (:lsl src (:$ count))))) 2411 2608 2412 (define-arm-vinsn natural-shift-right (((dest :u32)) 2413 ((src :u32) 2414 (count :u8const))) 2609 (define-arm-vinsn (natural-shift-right :predicatable) 2610 (((dest :u32)) 2611 ((src :u32) 2612 (count :u8const))) 2415 2613 ((:pred = count 0) 2416 2614 (mov dest src)) … … 2464 2662 2465 2663 2466 (define-arm-vinsn sign-extend-halfword (((dest :imm)) 2467 ((src :imm))) 2664 (define-arm-vinsn (sign-extend-halfword :predicatable) 2665 (((dest :imm)) 2666 ((src :imm))) 2468 2667 (mov dest (:lsl src (:$ (- 16 arm::fixnumshift)))) 2469 2668 (mov dest (:asr dest (:$ (- 16 arm::fixnumshift))))) … … 2472 2671 2473 2672 2474 (define-arm-vinsn fixnum-add (((dest t)) 2475 ((x t) 2476 (y t))) 2673 (define-arm-vinsn (fixnum-add :predicatable) 2674 (((dest t)) 2675 ((x t) 2676 (y t))) 2477 2677 (add dest x y)) 2478 2678 … … 2532 2732 2533 2733 ;;; (setq dest (- x y)) 2534 (define-arm-vinsn fixnum-sub (((dest t)) 2535 ((x t) 2536 (y t))) 2734 (define-arm-vinsn (fixnum-sub :predicatable) 2735 (((dest t)) 2736 ((x t) 2737 (y t))) 2537 2738 (sub dest x y)) 2538 2739 2539 (define-arm-vinsn fixnum-sub-from-constant (((dest :imm)) 2540 ((x :s16const) 2541 (y :imm))) 2740 (define-arm-vinsn (fixnum-sub-from-constant :predicatable) 2741 (((dest :imm)) 2742 ((x :s16const) 2743 (y :imm))) 2542 2744 (rsb dest y (:$ (:apply ash x arm::fixnumshift)))) 2543 2745 … … 2596 2798 2597 2799 ;;; This is, of course, also "subtract-immediate." 2598 (define-arm-vinsn add-immediate (((dest t)) 2599 ((src t) 2600 (imm :s32const))) 2800 (define-arm-vinsn (add-immediate :predicatable) 2801 (((dest t)) 2802 ((src t) 2803 (imm :s32const))) 2601 2804 (add dest src (:$ imm))) 2602 2805 2603 (define-arm-vinsn multiply-fixnums (((dest :imm)) 2604 ((a :imm) 2605 (b :imm)) 2606 ((unboxed :s32))) 2806 (define-arm-vinsn (multiply-fixnums :predicatable) 2807 (((dest :imm)) 2808 ((a :imm) 2809 (b :imm)) 2810 ((unboxed :s32))) 2607 2811 (mov unboxed (:asr b (:$ arm::fixnumshift))) 2608 2812 (mul dest a unboxed)) … … 2612 2816 ;;; Mask out the code field of a base character; the result 2613 2817 ;;; should be EXACTLY = to subtag-base-char 2614 (define-arm-vinsn mask-base-char (((dest :u32)) 2615 ((src :imm))) 2818 (define-arm-vinsn (mask-base-char :predicatable) 2819 (((dest :u32)) 2820 ((src :imm))) 2616 2821 (and dest src (:$ arm::subtag-mask))) 2617 2822 … … 2687 2892 (uuo-error-udf (:? ne) sym)) 2688 2893 2689 (define-arm-vinsn (temp-push-unboxed-word :push :word :sp) 2894 (define-arm-vinsn (temp-push-unboxed-word :push :word :sp :predicatable) 2895 2690 2896 (() 2691 2897 ((w :u32)) … … 2696 2902 (str w (:@ sp (:$ 4)))) 2697 2903 2698 (define-arm-vinsn (temp-pop-unboxed-word :pop :word :sp) 2904 (define-arm-vinsn (temp-pop-unboxed-word :pop :word :sp :predicatable) 2905 2699 2906 (((w :u32)) 2700 2907 ()) … … 2702 2909 (add sp sp (:$ arm::dnode-size))) 2703 2910 2704 (define-arm-vinsn (temp-push-double-float :push :doubleword :sp) 2911 (define-arm-vinsn (temp-push-double-float :push :doubleword :sp :predicatable) 2912 2705 2913 (() 2706 2914 ((d :double-float)) … … 2711 2919 (fstd d (:@ sp (:$ 8)))) 2712 2920 2713 (define-arm-vinsn (temp-pop-double-float :pop :doubleword :sp) 2921 (define-arm-vinsn (temp-pop-double-float :pop :doubleword :sp :predicatable) 2922 2714 2923 (() 2715 2924 ((d :double-float))) … … 2718 2927 2719 2928 2720 (define-arm-vinsn (temp-push-single-float :push :word :tsp) 2929 (define-arm-vinsn (temp-push-single-float :push :word :tsp :predicatable) 2930 2721 2931 (() 2722 2932 ((s :single-float)) … … 2728 2938 2729 2939 2730 (define-arm-vinsn (temp-pop-single-float :pop :word :sp) 2940 (define-arm-vinsn (temp-pop-single-float :pop :word :sp :predicatable) 2941 2731 2942 (() 2732 2943 ((s :single-float))) … … 2736 2947 2737 2948 2738 (define-arm-vinsn %current-frame-ptr (((dest :imm)) 2739 ()) 2949 (define-arm-vinsn (%current-frame-ptr :predicatable) 2950 (((dest :imm)) 2951 ()) 2740 2952 (mov dest arm::sp)) 2741 2953 2742 (define-arm-vinsn %current-tcr (((dest :imm)) 2743 ()) 2954 (define-arm-vinsn (%current-tcr :predicatable) 2955 (((dest :imm)) 2956 ()) 2744 2957 (mov dest rcontext)) 2745 2958 … … 2753 2966 (bl .SPunbind))) 2754 2967 2755 (define-arm-vinsn zero-double-float-register (((dest :double-float)) 2756 () 2757 ((low (:u32 #.arm::imm0)))) 2968 (define-arm-vinsn (zero-double-float-register :predicatable) 2969 (((dest :double-float)) 2970 () 2971 ((low (:u32 #.arm::imm0)))) 2758 2972 (mov low (:$ 0)) 2759 2973 (fmdrr dest low low)) 2760 2974 2761 (define-arm-vinsn zero-single-float-register (((dest :single-float)) 2762 () 2763 ((temp :imm))) 2975 (define-arm-vinsn (zero-single-float-register :predicatable) 2976 (((dest :single-float)) 2977 () 2978 ((temp :imm))) 2764 2979 (mov temp (:$ 0)) 2765 2980 (fmsr dest temp)) 2766 2981 2767 (define-arm-vinsn load-double-float-constant (((dest :double-float)) 2768 ((high :u32) 2769 (low :u32))) 2982 (define-arm-vinsn (load-double-float-constant :predicatable) 2983 (((dest :double-float)) 2984 ((high :u32) 2985 (low :u32))) 2770 2986 (fmdrr dest low high)) 2771 2987 2772 (define-arm-vinsn load-single-float-constant (((dest :single-float)) 2773 ((src t))) 2988 (define-arm-vinsn (load-single-float-constant :predicatable) 2989 (((dest :single-float)) 2990 ((src t))) 2774 2991 (fmsr dest src)) 2775 2992 2776 (define-arm-vinsn load-indexed-node (((node :lisp)) 2777 ((base :lisp) 2778 (offset :s16const))) 2993 (define-arm-vinsn (load-indexed-node :predicatable) 2994 (((node :lisp)) 2995 ((base :lisp) 2996 (offset :s16const))) 2779 2997 (ldr node (:@ base (:$ offset)))) 2780 2998 … … 2915 3133 2916 3134 2917 (define-arm-vinsn (jump-return-pc :jumpLR )3135 (define-arm-vinsn (jump-return-pc :jumpLR :predicatable) 2918 3136 (() 2919 3137 ()) 2920 3138 (bx lr)) 2921 3139 2922 (define-arm-vinsn (restore-full-lisp-context :lispcontext :pop :csp :lrRestore )3140 (define-arm-vinsn (restore-full-lisp-context :lispcontext :pop :csp :lrRestore :predicatable) 2923 3141 (() 2924 3142 ()) … … 2929 3147 2930 3148 2931 (define-arm-vinsn (popj :lispcontext :pop :csp :lrRestore :jumpLR )3149 (define-arm-vinsn (popj :lispcontext :pop :csp :lrRestore :jumpLR :predicatable) 2932 3150 (() 2933 3151 ()) … … 3048 3266 (ldr pc (:@ nfn (:$ arm::function.entrypoint)))) 3049 3267 3050 (define-arm-vinsn %schar8 (((char :imm)) 3051 ((str :lisp) 3052 (idx :imm)) 3053 ((imm :u32))) 3268 (define-arm-vinsn (%schar8 :predicatable) 3269 (((char :imm)) 3270 ((str :lisp) 3271 (idx :imm)) 3272 ((imm :u32))) 3054 3273 (mov imm (:lsr idx (:$ arm::fixnumshift))) 3055 3274 (add imm imm (:$ arm::misc-data-offset)) … … 3058 3277 (orr char imm (:$ arm::subtag-character))) 3059 3278 3060 (define-arm-vinsn %schar32 (((char :imm)) 3061 ((str :lisp) 3062 (idx :imm)) 3063 ((imm :u32))) 3279 (define-arm-vinsn (%schar32 :predicatable) 3280 (((char :imm)) 3281 ((str :lisp) 3282 (idx :imm)) 3283 ((imm :u32))) 3064 3284 (add imm idx (:$ arm::misc-data-offset)) 3065 3285 (ldr imm (:@ str imm)) … … 3068 3288 3069 3289 3070 (define-arm-vinsn %set-schar8 (() 3071 ((str :lisp) 3072 (idx :imm) 3073 (char :imm)) 3074 ((imm :u32) 3075 (imm1 :u32))) 3290 (define-arm-vinsn (%set-schar8 :predicatable) 3291 (() 3292 ((str :lisp) 3293 (idx :imm) 3294 (char :imm)) 3295 ((imm :u32) 3296 (imm1 :u32))) 3076 3297 (mov imm (:lsr idx (:$ arm::fixnumshift))) 3077 3298 (add imm imm (:$ arm::misc-data-offset)) … … 3079 3300 (strb imm1 (:@ str imm))) 3080 3301 3081 (define-arm-vinsn %set-schar32 (() 3082 ((str :lisp) 3083 (idx :imm) 3084 (char :imm)) 3085 ((imm :u32) 3086 (imm1 :u32))) 3302 (define-arm-vinsn (%set-schar32 :predicatable) 3303 (() 3304 ((str :lisp) 3305 (idx :imm) 3306 (char :imm)) 3307 ((imm :u32) 3308 (imm1 :u32))) 3087 3309 (add imm idx (:$ arm::misc-data-offset)) 3088 3310 (mov imm1 (:lsr char (:$ arm::charcode-shift))) 3089 3311 (str imm1 (:@ str imm))) 3090 3312 3091 (define-arm-vinsn %set-scharcode8 (() 3092 ((str :lisp) 3093 (idx :imm) 3094 (code :imm)) 3095 ((imm :u32) 3096 (imm1 :u32))) 3313 (define-arm-vinsn (%set-scharcode8 :predicatable) 3314 (() 3315 ((str :lisp) 3316 (idx :imm) 3317 (code :imm)) 3318 ((imm :u32) 3319 (imm1 :u32))) 3097 3320 (mov imm (:lsr idx (:$ arm::fixnumshift))) 3098 3321 (add imm imm (:$ arm::misc-data-offset)) … … 3101 3324 3102 3325 3103 (define-arm-vinsn %set-scharcode32 (() 3104 ((str :lisp) 3105 (idx :imm) 3106 (code :imm)) 3107 ((imm :u32) 3108 (imm1 :u32))) 3326 (define-arm-vinsn (%set-scharcode32 :predicatable) 3327 (() 3328 ((str :lisp) 3329 (idx :imm) 3330 (code :imm)) 3331 ((imm :u32) 3332 (imm1 :u32))) 3109 3333 (add imm idx (:$ arm::misc-data-offset)) 3110 3334 (mov imm1 (:lsr code (:$ arm::fixnumshift))) 3111 3335 (str imm1 (:@ str imm))) 3112 3336 3113 (define-arm-vinsn %scharcode8 (((code :imm)) 3114 ((str :lisp) 3115 (idx :imm)) 3116 ((imm :u32))) 3337 (define-arm-vinsn (%scharcode8 :predicatable) 3338 (((code :imm)) 3339 ((str :lisp) 3340 (idx :imm)) 3341 ((imm :u32))) 3117 3342 (mov imm (:lsr idx (:$ arm::fixnumshift))) 3118 3343 (add imm imm (:$ arm::misc-data-offset)) … … 3120 3345 (mov code (:lsl imm (:$ arm::fixnumshift)))) 3121 3346 3122 (define-arm-vinsn %scharcode32 (((code :imm)) 3123 ((str :lisp) 3124 (idx :imm)) 3125 ((imm :u32))) 3347 (define-arm-vinsn (%scharcode32 :predicatable) 3348 (((code :imm)) 3349 ((str :lisp) 3350 (idx :imm)) 3351 ((imm :u32))) 3126 3352 (add imm idx (:$ arm::misc-data-offset)) 3127 3353 (ldr imm (:@ str imm)) … … 3140 3366 (uuo-eep-unresolved (:? eq) dest src)) 3141 3367 3142 (define-arm-vinsn %natural+ (((dest :u32)) 3143 ((x :u32) (y :u32))) 3368 (define-arm-vinsn (%natural+ :predicatable) 3369 (((dest :u32)) 3370 ((x :u32) (y :u32))) 3144 3371 (add dest x y)) 3145 3372 3146 (define-arm-vinsn %natural+-c (((dest :u32)) 3147 ((x :u32) (y :u16const))) 3373 (define-arm-vinsn (%natural+-c :predicatable) 3374 (((dest :u32)) 3375 ((x :u32) (y :u16const))) 3148 3376 (add dest x (:$ y))) 3149 3377 3150 (define-arm-vinsn %natural- (((dest :u32)) 3151 ((x :u32) (y :u32))) 3378 (define-arm-vinsn (%natural- :predicatable) 3379 (((dest :u32)) 3380 ((x :u32) (y :u32))) 3152 3381 (sub dest x y)) 3153 3382 3154 (define-arm-vinsn %natural--c (((dest :u32)) 3155 ((x :u32) (y :u16const))) 3383 (define-arm-vinsn (%natural--c :predicatable) 3384 (((dest :u32)) 3385 ((x :u32) (y :u16const))) 3156 3386 (sub dest x (:$ y))) 3157 3387 3158 (define-arm-vinsn %natural-logior (((dest :u32)) 3159 ((x :u32) (y :u32))) 3388 (define-arm-vinsn (%natural-logior :predicatable) 3389 (((dest :u32)) 3390 ((x :u32) (y :u32))) 3160 3391 (orr dest x y)) 3161 3392 3162 (define-arm-vinsn %natural-logior-c (((dest :u32)) 3163 ((x :u32) (c :u32const))) 3393 (define-arm-vinsn (%natural-logior-c :predicatable) 3394 (((dest :u32)) 3395 ((x :u32) (c :u32const))) 3164 3396 (orr dest x (:$ c))) 3165 3397 3166 (define-arm-vinsn %natural-logxor (((dest :u32)) 3167 ((x :u32) (y :u32))) 3398 (define-arm-vinsn (%natural-logxor :predicatable) 3399 (((dest :u32)) 3400 ((x :u32) (y :u32))) 3168 3401 (eor dest x y)) 3169 3402 3170 (define-arm-vinsn %natural-logxor-c (((dest :u32)) 3171 ((x :u32) (c :u32const))) 3403 (define-arm-vinsn (%natural-logxor-c :predicatable) 3404 (((dest :u32)) 3405 ((x :u32) (c :u32const))) 3172 3406 (eor dest x (:$ c))) 3173 3407 3174 (define-arm-vinsn %natural-logand (((dest :u32)) 3175 ((x :u32) (y :u32))) 3408 (define-arm-vinsn (%natural-logand :predicatable) 3409 (((dest :u32)) 3410 ((x :u32) (y :u32))) 3176 3411 (and dest x y)) 3177 3412 … … 3199 3434 3200 3435 3201 (define-arm-vinsn disable-interrupts (((dest :lisp)) 3202 () 3203 ((temp :imm) 3204 (temp2 :imm))) 3436 (define-arm-vinsn (disable-interrupts :predicatable) 3437 (((dest :lisp)) 3438 () 3439 ((temp :imm) 3440 (temp2 :imm))) 3205 3441 (ldr temp2 (:@ rcontext (:$ arm::tcr.tlb-pointer))) 3206 3442 (mov temp (:$ -4)) … … 3208 3444 (str temp (:@ temp2 (:$ arm::interrupt-level-binding-index)))) 3209 3445 3210 (define-arm-vinsn load-character-constant (((dest :lisp)) 3211 ((code :u32const))) 3446 (define-arm-vinsn (load-character-constant :predicatable) 3447 (((dest :lisp)) 3448 ((code :u32const))) 3212 3449 (mov dest (:$ arm::subtag-character)) 3213 3450 ((:pred logtest #xff code) … … 3274 3511 (define-arm-subprim-jump-vinsn (tail-funcall-slide) .SPtfuncallslide) 3275 3512 3276 (define-arm-vinsn (tail-funcall-vsp :jumpLR ) (() ())3513 (define-arm-vinsn (tail-funcall-vsp :jumpLR :predicatable) (() ()) 3277 3514 (ldmia (:! sp) (imm0 vsp fn lr)) 3278 3515 (ba .SPfuncall)) … … 3487 3724 (uuo-interrupt-now (:? ne)) 3488 3725 :done) 3726 3727 (define-arm-vinsn test-fixnum (((dest :crf)) 3728 ((src :lisp))) 3729 (tst src (:$ arm::fixnummask))) 3730 3489 3731 3490 3732 -
branches/arm/compiler/ARM/arm2.lisp
r13897 r13955 35 35 (defparameter *arm2-half-fixnum-type* '(signed-byte 29)) 36 36 (defparameter *arm2-target-half-fixnum-type* nil) 37 (defparameter *arm2-operator-supports-u8-target* ()) 38 37 39 38 40 … … 49 51 ,@body)) 50 52 53 54 (defun arm2-emit-vinsn (vlist name vinsn-table &rest vregs) 55 (arm2-update-regmap (apply #'%emit-vinsn vlist name vinsn-table vregs))) 51 56 52 57 (defmacro with-arm-local-vinsn-macros ((segvar &optional vreg-var xfer-var) &body body) … … 62 67 (unless ,template-temp 63 68 (warn "VINSN \"~A\" not defined" ,template-name-var)) 64 `(arm2- update-regmap (%emit-vinsn ,',segvar ',,template-name-var (backend-p2-vinsn-templates *target-backend*) ,@,args-var)))))69 `(arm2-emit-vinsn ,',segvar ',,template-name-var (backend-p2-vinsn-templates *target-backend*) ,@,args-var)))) 65 70 (macrolet ((<- (,retvreg-var) 66 71 `(arm2-copy-register ,',segvar ,',vreg-var ,,retvreg-var)) … … 513 518 514 519 (defun arm2-update-regmap (vinsn) 515 (if (vinsn-attribute-p vinsn :call :jump)520 (if (vinsn-attribute-p vinsn :call) 516 521 (arm2-invalidate-regmap) 517 522 (setq *arm2-gpr-locations-valid-mask* (logandc2 *arm2-gpr-locations-valid-mask* (vinsn-gprs-set vinsn)))) … … 560 565 (setq mask (logandc2 mask (ash 1 i))))))))))) 561 566 567 (defun arm2-copy-regmap (mask from to) 568 (dotimes (i 16) 569 (when (logbitp i mask) 570 (setf (svref to i) (copy-list (svref from i)))))) 571 572 (defmacro with-arm2-saved-regmap ((mask map) &body body) 573 `(let* ((,mask *arm2-gpr-locations-valid-mask*) 574 (,map (make-array 16 :initial-element nil))) 575 (declare (dynamic-extent ,map)) 576 (arm2-copy-regmap ,mask *arm2-gpr-locations* ,map) 577 ,@body)) 562 578 563 579 (defun arm2-generate-pc-source-map (debug-info) … … 2746 2762 (let* ((copy (if (eq (hard-regspec-class pushed-reg) 2747 2763 hard-reg-class-fpr) 2748 (! copy-fpr popped-reg pushed-reg) 2764 (if (eql (get-regspec-mode pushed-reg) 2765 hard-reg-class-fpr-mode-single) 2766 (! single-to-single popped-reg pushed-reg) 2767 (! double-to-double popped-reg pushed-reg)) 2749 2768 (! copy-gpr popped-reg pushed-reg)))) 2750 2769 (remove-dll-node copy) … … 3090 3109 arm::slot-unbound-marker)))))) 3091 3110 3111 (defun arm2-acode-operator-supports-u8 (form) 3112 (setq form (acode-unwrapped-form-value form)) 3113 (when (acode-p form) 3114 (let* ((operator (acode-operator form))) 3115 (if (member operator *arm2-operator-supports-u8-target*) 3116 (values operator (acode-operand 1 form)))))) 3117 3118 (defun arm2-compare-u8 (seg vreg xfer form u8constant cr-bit true-p u8-operator) 3119 (with-arm-local-vinsn-macros (seg vreg xfer) 3120 (with-imm-target () (u8 :u8) 3121 (with-crf-target () crf 3122 (if (and (eql u8-operator (%nx1-operator lisptag)) 3123 (eql 0 u8constant) 3124 (eql cr-bit arm::arm-cond-eq)) 3125 (let* ((formreg (arm2-one-untargeted-reg-form seg form arm::arg_z))) 3126 (! test-fixnum crf formreg)) 3127 (progn 3128 (arm2-use-operator u8-operator seg u8 nil form) 3129 (! compare-immediate crf u8 u8constant)))) 3130 ;; Flags set. Branch or return a boolean value ? 3131 (regspec-crf-gpr-case 3132 (vreg dest) 3133 (^ cr-bit true-p) 3134 (progn 3135 (ensuring-node-target (target dest) 3136 (if (not true-p) 3137 (setq cr-bit (logxor 1 cr-bit))) 3138 (! cond->boolean target cr-bit)) 3139 (^)))))) 3092 3140 3093 3141 ;;; There are other cases involving constants that are worth exploiting. 3094 3142 (defun arm2-compare (seg vreg xfer i j cr-bit true-p) 3095 3143 (with-arm-local-vinsn-macros (seg vreg xfer) 3096 (let* ((jconst (arm2-constant-for-compare-p j)) 3144 (let* ((iu8 (let* ((i-fixnum (acode-fixnum-form-p i))) 3145 (if (typep i-fixnum '(unsigned-byte 8)) 3146 i-fixnum))) 3147 (ju8 (let* ((j-fixnum (acode-fixnum-form-p j))) 3148 (if (typep j-fixnum '(unsigned-byte 8)) 3149 j-fixnum))) 3150 (u8 (or iu8 ju8)) 3151 (other-u8 (if iu8 j (if ju8 i))) 3152 (jconst (arm2-constant-for-compare-p j)) 3097 3153 (iconst (arm2-constant-for-compare-p i)) 3098 3154 (boolean (backend-crf-p vreg))) 3099 (if (and boolean (or iconst jconst)) 3100 (let* ((reg (arm2-one-untargeted-reg-form seg (if jconst i j) arm::arg_z))) 3101 (! compare-immediate vreg reg (or jconst iconst)) 3102 (unless (or jconst (eq cr-bit arm::arm-cond-eq)) 3103 (setq cr-bit (arm2-cr-bit-for-reversed-comparison cr-bit))) 3104 (^ cr-bit true-p)) 3105 (if (and (eq cr-bit arm::arm-cond-eq) 3106 (or jconst iconst)) 3107 (arm2-test-reg-%izerop 3108 seg 3109 vreg 3110 xfer 3111 (arm2-one-untargeted-reg-form 3112 seg 3113 (if jconst i j) 3114 arm::arg_z) 3115 cr-bit 3116 true-p 3117 (or jconst iconst)) 3118 (multiple-value-bind (ireg jreg) (arm2-two-untargeted-reg-forms seg i arm::arg_y j arm::arg_z) 3119 (arm2-compare-registers seg vreg xfer ireg jreg cr-bit true-p))))))) 3155 (multiple-value-bind (u8-operator u8-operand) (if other-u8 (arm2-acode-operator-supports-u8 other-u8)) 3156 (if u8-operator 3157 (arm2-compare-u8 seg vreg xfer u8-operand u8 (if (and iu8 (not (eq cr-bit arm::arm-cond-eq))) (logxor 1 cr-bit) cr-bit) true-p u8-operator) 3158 (if (and boolean (or iconst jconst)) 3159 (let* ((reg (arm2-one-untargeted-reg-form seg (if jconst i j) arm::arg_z))) 3160 (! compare-immediate vreg reg (or jconst iconst)) 3161 (unless (or jconst (eq cr-bit arm::arm-cond-eq)) 3162 (setq cr-bit (arm2-cr-bit-for-reversed-comparison cr-bit))) 3163 (^ cr-bit true-p)) 3164 (if (and (eq cr-bit arm::arm-cond-eq) 3165 (or jconst iconst)) 3166 (arm2-test-reg-%izerop 3167 seg 3168 vreg 3169 xfer 3170 (arm2-one-untargeted-reg-form 3171 seg 3172 (if jconst i j) 3173 arm::arg_z) 3174 cr-bit 3175 true-p 3176 (or jconst iconst)) 3177 (multiple-value-bind (ireg jreg) (arm2-two-untargeted-reg-forms seg i arm::arg_y j arm::arg_z) 3178 (arm2-compare-registers seg vreg xfer ireg jreg cr-bit true-p))))))))) 3120 3179 3121 3180 … … 3392 3451 (if (and src-fpr dest-fpr) 3393 3452 (unless (eql dest-fpr src-fpr) 3394 (! copy-fpr dest src)))))))))))) 3453 (case src-mode 3454 (#.hard-reg-class-fpr-mode-single 3455 (case dest-mode 3456 (#.hard-reg-class-fpr-mode-single 3457 (! single-to-single dest src)) 3458 (#.hard-reg-class-fpr-mode-double 3459 (! single-to-double dest src)))) 3460 (#.hard-reg-class-fpr-mode-double 3461 (case dest-mode 3462 (#.hard-reg-class-fpr-mode-single 3463 (! double-to-single dest src)) 3464 (#.hard-reg-class-fpr-mode-double 3465 (! double-to-double dest src)))))))))))))))) 3395 3466 3396 3467 (defun arm2-unreachable-store (&optional vreg) … … 4786 4857 (vp (vinsn-variable-parts vinsn)) 4787 4858 (nvp (vinsn-template-nvp template)) 4859 (predicate (vinsn-annotation vinsn)) 4788 4860 (unique-labels ()) 4789 4861 (operand-insert-functions arm::*arm-vinsn-insert-functions*)) … … 4826 4898 (operands (cdr f))) 4827 4899 (setf (arm::lap-instruction-opcode insn) (car f)) 4900 (when predicate 4901 (funcall (svref operand-insert-functions 4902 (arm::encode-vinsn-field-type :cond)) 4903 insn 4904 predicate)) 4828 4905 (dolist (op operands (append-dll-node insn current)) 4829 4906 (let* ((insert-function (svref operand-insert-functions (car op)))) … … 5396 5473 (arm2-test-reg-%izerop seg vreg xfer target cr-bit true-p 0))))) 5397 5474 5398 5475 (pushnew (%nx1-operator lisptag) *arm2-operator-supports-u8-target*) 5399 5476 (defarm2 arm2-lisptag lisptag (seg vreg xfer node) 5400 5477 (if (null vreg) 5401 5478 (arm2-form seg vreg xfer node) 5402 (progn 5403 (ensuring-node-target (target vreg) 5404 (! extract-tag-fixnum target (arm2-one-untargeted-reg-form seg node arm::arg_z))) 5479 (let* ((reg (arm2-one-untargeted-reg-form seg node arm::arg_z))) 5480 (unboxed-other-case (vreg :u8) 5481 (! extract-tag vreg reg) 5482 (ensuring-node-target (target vreg) 5483 (! extract-tag-fixnum target reg))) 5405 5484 (^)))) 5406 5485 5486 (pushnew (%nx1-operator fulltag) *arm2-operator-supports-u8-target*) 5407 5487 (defarm2 arm2-fulltag fulltag (seg vreg xfer node) 5408 5488 (if (null vreg) 5409 5489 (arm2-form seg vreg xfer node) 5410 (progn 5490 (let* ((reg (arm2-one-untargeted-reg-form seg node arm::arg_z))) 5491 (unboxed-other-case (vreg :u8) 5492 (! extract-fulltag vreg reg) 5411 5493 (ensuring-node-target (target vreg) 5412 (! extract-fulltag-fixnum target (arm2-one-untargeted-reg-form seg node arm::arg_z)))5494 (! extract-fulltag-fixnum target reg))) 5413 5495 (^)))) 5414 5496 5497 5498 (pushnew (%nx1-operator typecode) *arm2-operator-supports-u8-target*) 5415 5499 (defarm2 arm2-typecode typecode (seg vreg xfer node) 5416 5500 (if (null vreg) 5417 5501 (arm2-form seg vreg xfer node) 5418 (let* ((reg (arm2-one-untargeted-reg-form seg node (if (eq (hard-regspec-value vreg) arm::arg_z) 5419 arm::arg_y arm::arg_z)))) 5502 (let* ((reg (arm2-one-untargeted-reg-form seg node arm::arg_z))) 5503 (unboxed-other-case (vreg :u8) 5504 (! extract-typecode vreg reg) 5420 5505 (ensuring-node-target (target vreg) 5421 (! extract-typecode-fixnum target reg )) 5506 (! extract-typecode-fixnum target reg ))) 5422 5507 (^)))) 5423 5508 … … 5814 5899 (<- arm::arg_z) 5815 5900 (^))))) 5816 5901 5902 ;;; If exactly one vinsn references LAB and that vinsn is a conditional 5903 ;;; branch, it's a forward branch. If every vinsn between the branch 5904 ;;; and label can be predicated, do so and remove both the branch and 5905 ;;; the label. 5906 ;;; "predicate" is being used as a verb here - "to make predicated". 5907 (defun arm2-predicate-block (labelnum) 5908 (let* ((lab (aref *backend-labels* labelnum)) 5909 (refs (vinsn-label-refs lab)) 5910 (branch (car refs))) 5911 (if (and (vinsn-attribute-p branch :branch) 5912 (null (cdr refs))) 5913 (when (do* ((next (dll-node-succ branch) (dll-node-succ next)) 5914 (vinsn-p nil)) 5915 ((eq next lab) (return vinsn-p)) 5916 (if (typep next 'vinsn-label) 5917 (unless (typep (vinsn-label-id next) 'vinsn-note) 5918 (return)) 5919 (progn 5920 (unless (and (typep next 'vinsn) 5921 (null (vinsn-annotation next)) 5922 (vinsn-attribute-p next :predicatable) 5923 (or (eq lab (dll-node-succ next)) 5924 (not (vinsn-attribute-p next :jump :call :subprim-call :jumpLR)))) 5925 (return)) 5926 (setq vinsn-p t)))) 5927 (multiple-value-bind (branch-true-p branch-condition cond-operand-index) 5928 (let* ((branch-instr (car (vinsn-template-body (vinsn-template branch)))) 5929 (values (vinsn-variable-parts branch)) 5930 (operands (cdr branch-instr))) 5931 (dolist (op operands (values nil nil nil)) 5932 (cond ((eql (car op) (arm::encode-vinsn-field-type :cond)) 5933 (return (values t (svref values (cadr op)) (cadr op)))) 5934 ((eql (car op) (arm::encode-vinsn-field-type :negated-cond)) 5935 (return (values nil (svref values (cadr op)) (cadr op))))))) 5936 (when branch-condition 5937 (let* ((condition (if branch-true-p (logxor 1 branch-condition) branch-condition))) 5938 (do* ((next (dll-node-succ branch) (dll-node-succ next))) 5939 ((eq next lab) 5940 (remove-dll-node branch) 5941 (remove-dll-node lab) 5942 t) 5943 (cond ((typep next 'vinsn-label)) 5944 ((vinsn-attribute-p next :jump) 5945 (setf (vinsn-template next) 5946 (need-vinsn-template 'cbranch-true 5947 (backend-p2-vinsn-templates 5948 *target-backend*)) 5949 (svref (vinsn-variable-parts next) cond-operand-index) 5950 condition)) 5951 (t (setf (vinsn-annotation next) condition))))))))))) 5952 5817 5953 5818 5954 (defarm2 arm2-if if (seg vreg xfer testform true false &aux test-val) … … 5837 5973 need-else 5838 5974 (arm2-single-valued-form-p true) 5839 (arm2-single-valued-form-p false)))) 5975 (arm2-single-valued-form-p false))) 5976 (saved-reg-mask 0) 5977 (saved-reg-map (make-array 16 :initial-element nil))) 5978 (declare (dynamic-extent saved-reg-map)) 5840 5979 (if (eq 0 xfer) 5841 5980 (setq xfer nil)) … … 5844 5983 (let ((merge-else-branch-label (if (nx-null false) (arm2-find-nilret-label)))) 5845 5984 (arm2-conditional-form seg (arm2-make-compound-cd 0 falselabel) testform) 5985 (arm2-copy-regmap (setq saved-reg-mask *arm2-gpr-locations-valid-mask*) 5986 *arm2-gpr-locations* 5987 saved-reg-map) 5846 5988 (arm2-form seg result endlabel true) 5847 5989 (if (and merge-else-branch-label (neq -1 (aref *backend-labels* merge-else-branch-label))) … … 5849 5991 (progn 5850 5992 (@ falselabel) 5993 (arm2-predicate-block falselabel) 5851 5994 (if (nx-null false) (@ (arm2-record-nilret-label))) 5852 (arm2-form seg result nil false))) 5995 (let* ((*arm2-gpr-locations-valid-mask* saved-reg-mask) 5996 (*arm2-gpr-locations* saved-reg-map)) 5997 (arm2-form seg result nil false)))) 5853 5998 (@ endlabel) 5999 (arm2-predicate-block endlabel) 5854 6000 (<- result) 5855 6001 (^))) … … 5865 6011 (if true-is-goto 0 falselabel) 5866 6012 (if true-is-goto xfer (arm2-cd-merge xfer falselabel))))) 5867 testform) 6013 testform) 6014 (arm2-copy-regmap (setq saved-reg-mask *arm2-gpr-locations-valid-mask*) 6015 *arm2-gpr-locations* 6016 saved-reg-map) 5868 6017 (if true-is-goto 5869 6018 (arm2-unreachable-store) … … 5883 6032 (progn 5884 6033 (@ falselabel) 6034 (arm2-predicate-block falselabel) 5885 6035 (when need-else 5886 6036 (if true-cleanup-label 5887 6037 (arm2-mvpass seg false) 5888 (arm2-form seg vreg xfer false)) 6038 (let* ((*arm2-gpr-locations-valid-mask* saved-reg-mask) 6039 (*arm2-gpr-locations* saved-reg-map)) 6040 (arm2-form seg vreg xfer false))) 5889 6041 (setq false-stack (arm2-encode-stack)))))) 5890 6042 (when true-cleanup-label … … 5904 6056 (multiple-value-setq (*arm2-undo-count* *arm2-cstack* *arm2-vstack* *arm2-top-vstack-lcell*) 5905 6057 (arm2-decode-stack entry-stack))) 5906 (@ endlabel)))))) 6058 (@ endlabel) 6059 (arm2-predicate-block endlabel)))))) 5907 6060 5908 6061 (defarm2 arm2-or or (seg vreg xfer forms) -
branches/arm/compiler/vinsn.lisp
r13740 r13955 264 264 :discard ; adjusts a stack pointer 265 265 :sp 266 : unconditional ; all instructions are implicitly unconditional266 :predicatable ; all instructions can be predicated, no instructions set or test condition codes. 267 267 )) 268 268 -
branches/arm/level-0/ARM/arm-misc.lisp
r13927 r13955 846 846 );#+later 847 847 848 848 (defarmlapfunction xchgl ((newval arg_y) (ptr arg_z)) 849 (unbox-fixnum imm0 newval) 850 @again 851 (macptr-ptr imm2 ptr) 852 (ldrex imm1 (:@ imm2)) 853 (strex imm2 imm0 (:@ imm2)) 854 (cmp imm2 (:$ 0)) 855 (bne @again) 856 (box-fixnum arg_z imm1) 857 (bx lr)) 858 849 859 850 860 ; end of arm-misc.lisp -
branches/arm/level-0/l0-misc.lisp
r13927 r13955 219 219 220 220 221 ;;; Returns six values .221 ;;; Returns six values on most platforms, 4 on ARM. 222 222 ;;; sp free 223 223 ;;; sp used 224 224 ;;; vsp free 225 225 ;;; vsp used 226 ;;; tsp free 227 ;;; tsp used 226 ;;; tsp free (not on ARM) 227 ;;; tsp used (not on ARM) 228 228 (defun %thread-stack-space (&optional (thread *current-lisp-thread*)) 229 229 (when (eq thread *current-lisp-thread*) … … 347 347 (let* ((processes (all-processes))) 348 348 (dolist (thread-info stack-used-by-thread) 349 (destructuring-bind (thread sp-free sp-used vsp-free vsp-used tsp-freetsp-used)349 (destructuring-bind (thread sp-free sp-used vsp-free vsp-used #-arm-target tsp-free #-arm-target tsp-used) 350 350 thread-info 351 351 (let* ((process (dolist (p processes) … … 355 355 (let ((sp-total (+ sp-used sp-free)) 356 356 (vsp-total (+ vsp-used vsp-free)) 357 #-arm-target 357 358 (tsp-total (+ tsp-used tsp-free))) 358 359 (format t "~%~a(~d)~% cstack:~12T~10D (~DK) ~33T~10D (~DK) ~54T~10D (~DK)~ 359 ~% vstack:~12T~10D (~DK) ~33T~10D (~DK) ~54T~10D (~DK)~ 360 ~% tstack:~12T~10D (~DK) ~33T~10D (~DK) ~54T~10D (~DK)" 360 ~% vstack:~12T~10D (~DK) ~33T~10D (~DK) ~54T~10D (~DK)" 361 361 (process-name process) 362 362 (process-serial-number process) 363 363 sp-total (k sp-total) sp-free (k sp-free) sp-used (k sp-used) 364 vsp-total (k vsp-total) vsp-free (k vsp-free) vsp-used (k vsp-used) 364 vsp-total (k vsp-total) vsp-free (k vsp-free) vsp-used (k vsp-used)) 365 #-arm-target 366 (format t 367 "~% tstack:~12T~10D (~DK) ~33T~10D (~DK) ~54T~10D (~DK)" 368 365 369 tsp-total (k tsp-total) tsp-free (k tsp-free) tsp-used (k tsp-used))))))))))))) 366 370
Note: See TracChangeset
for help on using the changeset viewer.