Changeset 8253
- Timestamp:
- Jan 23, 2008, 11:49:34 PM (17 years ago)
- File:
-
- 1 edited
-
branches/ia32/lisp-kernel/x86-spentry32.s (modified) (12 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/ia32/lisp-kernel/x86-spentry32.s
r8223 r8253 42 42 _endsubp(misc_ref) 43 43 44 /* %imm0 = subtag, %arg_y = uvector, %arg_z = index. */ 45 /* Bounds/type-checking done in caller. */ 44 46 _startfn(C(misc_ref_common)) 45 __(int $3) 47 __(shll $word_shift,%imm0) 48 __(addl $local_label(misc_ref_jmp),%imm0) 49 __(jmp (%imm0)) 50 .p2align 2 51 local_label(misc_ref_jmp): 52 /* 00-0f */ 53 .long local_label(misc_ref_invalid) /* 00 even_fixnum */ 54 .long local_label(misc_ref_invalid) /* 01 cons */ 55 .long local_label(misc_ref_invalid) /* 02 nodeheader */ 56 .long local_label(misc_ref_invalid) /* 03 imm */ 57 .long local_label(misc_ref_invalid) /* 04 odd_fixnum */ 58 .long local_label(misc_ref_invalid) /* 05 tra */ 59 .long local_label(misc_ref_invalid) /* 06 misc */ 60 .long local_label(misc_ref_u32) /* 07 bignum */ 61 .long local_label(misc_ref_invalid) /* 08 even_fixnum */ 62 .long local_label(misc_ref_invalid) /* 09 cons */ 63 .long local_label(misc_ref_node) /* 0a ratio */ 64 .long local_label(misc_ref_invalid) /* 0b imm */ 65 .long local_label(misc_ref_invalid) /* 0c odd_fixnum */ 66 .long local_label(misc_ref_invalid) /* 0d tra */ 67 .long local_label(misc_ref_invalid) /* 0e misc */ 68 .long local_label(misc_ref_u32) /* 0f single_float */ 69 /* 10-1f */ 70 .long local_label(misc_ref_invalid) /* 10 even_fixnum */ 71 .long local_label(misc_ref_invalid) /* 11 cons */ 72 .long local_label(misc_ref_invalid) /* 12 nodeheader */ 73 .long local_label(misc_ref_invalid) /* 13 imm */ 74 .long local_label(misc_ref_invalid) /* 14 odd_fixnum */ 75 .long local_label(misc_ref_invalid) /* 15 tra */ 76 .long local_label(misc_ref_invalid) /* 16 misc */ 77 .long local_label(misc_ref_u32) /* 17 double_float */ 78 .long local_label(misc_ref_invalid) /* 18 even_fixnum */ 79 .long local_label(misc_ref_invalid) /* 19 cons */ 80 .long local_label(misc_ref_node) /* 1a complex */ 81 .long local_label(misc_ref_invalid) /* 1b imm */ 82 .long local_label(misc_ref_invalid) /* 1c odd_fixnum */ 83 .long local_label(misc_ref_invalid) /* 1d tra */ 84 .long local_label(misc_ref_invalid) /* 1e misc */ 85 .long local_label(misc_ref_u32) /* 1f macptr */ 86 /* 20-2f */ 87 .long local_label(misc_ref_invalid) /* 20 even_fixnum */ 88 .long local_label(misc_ref_invalid) /* 21 cons */ 89 .long local_label(misc_ref_invalid) /* 22 catch_frame */ 90 .long local_label(misc_ref_invalid) /* 23 imm */ 91 .long local_label(misc_ref_invalid) /* 24 odd_fixnum */ 92 .long local_label(misc_ref_invalid) /* 25 tra */ 93 .long local_label(misc_ref_invalid) /* 26 misc */ 94 .long local_label(misc_ref_u32) /* 27 dead_macptr */ 95 .long local_label(misc_ref_invalid) /* 28 even_fixnum */ 96 .long local_label(misc_ref_invalid) /* 29 cons */ 97 .long local_label(misc_ref_function) /* 2a function */ 98 .long local_label(misc_ref_invalid) /* 2b imm */ 99 .long local_label(misc_ref_invalid) /* 2c odd_fixnum */ 100 .long local_label(misc_ref_invalid) /* 2d tra */ 101 .long local_label(misc_ref_invalid) /* 2e misc */ 102 .long local_label(misc_ref_invalid) /* 2f immheader */ 103 /* 30-3f */ 104 .long local_label(misc_ref_invalid) /* 30 even_fixnum */ 105 .long local_label(misc_ref_invalid) /* 31 cons */ 106 .long local_label(misc_ref_invalid) /* 32 nodeheader */ 107 .long local_label(misc_ref_invalid) /* 33 imm */ 108 .long local_label(misc_ref_invalid) /* 34 odd_fixnum */ 109 .long local_label(misc_ref_invalid) /* 35 tra */ 110 .long local_label(misc_ref_invalid) /* 36 misc */ 111 .long local_label(misc_ref_invalid) /* 37 immheader */ 112 .long local_label(misc_ref_invalid) /* 38 even_fixnum */ 113 .long local_label(misc_ref_invalid) /* 39 cons */ 114 .long local_label(misc_ref_node) /* 3a symbol */ 115 .long local_label(misc_ref_invalid) /* 3b imm */ 116 .long local_label(misc_ref_invalid) /* 3c odd_fixnum */ 117 .long local_label(misc_ref_invalid) /* 3d tra */ 118 .long local_label(misc_ref_invalid) /* 3e misc */ 119 .long local_label(misc_ref_u32) /* 3f xcode_vector */ 120 /* 40-4f */ 121 .long local_label(misc_ref_invalid) /* 40 even_fixnum */ 122 .long local_label(misc_ref_invalid) /* 41 cons */ 123 .long local_label(misc_ref_node) /* 42 lock */ 124 .long local_label(misc_ref_invalid) /* 43 imm */ 125 .long local_label(misc_ref_invalid) /* 44 odd_fixnum */ 126 .long local_label(misc_ref_invalid) /* 45 tra */ 127 .long local_label(misc_ref_invalid) /* 46 misc */ 128 .long local_label(misc_ref_invalid) /* 47 immheader */ 129 .long local_label(misc_ref_invalid) /* 48 even_fixnum */ 130 .long local_label(misc_ref_invalid) /* 49 cons */ 131 .long local_label(misc_ref_node) /* 4a hash_vector */ 132 .long local_label(misc_ref_invalid) /* 4b imm */ 133 .long local_label(misc_ref_invalid) /* 4c odd_fixnum */ 134 .long local_label(misc_ref_invalid) /* 4d tra */ 135 .long local_label(misc_ref_invalid) /* 4e misc */ 136 .long local_label(misc_ref_invalid) /* 4f immheader */ 137 /* 50-5f */ 138 .long local_label(misc_ref_invalid) /* 50 even_fixnum */ 139 .long local_label(misc_ref_invalid) /* 51 cons */ 140 .long local_label(misc_ref_node) /* 52 pool */ 141 .long local_label(misc_ref_invalid) /* 53 imm */ 142 .long local_label(misc_ref_invalid) /* 54 odd_fixnum */ 143 .long local_label(misc_ref_invalid) /* 55 tra */ 144 .long local_label(misc_ref_invalid) /* 56 misc */ 145 .long local_label(misc_ref_invalid) /* 57 immheader */ 146 .long local_label(misc_ref_invalid) /* 58 even_fixnum */ 147 .long local_label(misc_ref_invalid) /* 59 cons */ 148 .long local_label(misc_ref_node) /* 5a weak */ 149 .long local_label(misc_ref_invalid) /* 5b imm */ 150 .long local_label(misc_ref_invalid) /* 5c odd_fixnum */ 151 .long local_label(misc_ref_invalid) /* 5d tra */ 152 .long local_label(misc_ref_invalid) /* 5e misc */ 153 .long local_label(misc_ref_invalid) /* 5f immheader */ 154 /* 60-6f */ 155 .long local_label(misc_ref_invalid) /* 60 even_fixnum */ 156 .long local_label(misc_ref_invalid) /* 61 cons */ 157 .long local_label(misc_ref_node) /* 62 package */ 158 .long local_label(misc_ref_invalid) /* 63 imm */ 159 .long local_label(misc_ref_invalid) /* 64 odd_fixnum */ 160 .long local_label(misc_ref_invalid) /* 65 tra */ 161 .long local_label(misc_ref_invalid) /* 66 misc */ 162 .long local_label(misc_ref_invalid) /* 67 immheader */ 163 .long local_label(misc_ref_invalid) /* 68 even_fixnum */ 164 .long local_label(misc_ref_invalid) /* 69 cons */ 165 .long local_label(misc_ref_node) /* 6a slot_vector */ 166 .long local_label(misc_ref_invalid) /* 6b imm */ 167 .long local_label(misc_ref_invalid) /* 6c odd_fixnum */ 168 .long local_label(misc_ref_invalid) /* 6d tra */ 169 .long local_label(misc_ref_invalid) /* 6e misc */ 170 .long local_label(misc_ref_invalid) /* 6f immheader */ 171 /* 70-7f */ 172 .long local_label(misc_ref_invalid) /* 70 even_fixnum */ 173 .long local_label(misc_ref_invalid) /* 71 cons */ 174 .long local_label(misc_ref_node) /* 72 instance */ 175 .long local_label(misc_ref_invalid) /* 73 imm */ 176 .long local_label(misc_ref_invalid) /* 74 odd_fixnum */ 177 .long local_label(misc_ref_invalid) /* 75 tra */ 178 .long local_label(misc_ref_invalid) /* 76 misc */ 179 .long local_label(misc_ref_invalid) /* 77 immheader */ 180 .long local_label(misc_ref_invalid) /* 78 even_fixnum */ 181 .long local_label(misc_ref_invalid) /* 79 cons */ 182 .long local_label(misc_ref_node) /* 7a struct */ 183 .long local_label(misc_ref_invalid) /* 7b imm */ 184 .long local_label(misc_ref_invalid) /* 7c odd_fixnum */ 185 .long local_label(misc_ref_invalid) /* 7d tra */ 186 .long local_label(misc_ref_invalid) /* 7e misc */ 187 .long local_label(misc_ref_invalid) /* 7f immheader */ 188 /* 80-8f */ 189 .long local_label(misc_ref_invalid) /* 80 even_fixnum */ 190 .long local_label(misc_ref_invalid) /* 81 cons */ 191 .long local_label(misc_ref_node) /* 82 istruct */ 192 .long local_label(misc_ref_invalid) /* 83 imm */ 193 .long local_label(misc_ref_invalid) /* 84 odd_fixnum */ 194 .long local_label(misc_ref_invalid) /* 85 tra */ 195 .long local_label(misc_ref_invalid) /* 86 misc */ 196 .long local_label(misc_ref_invalid) /* 87 immheader */ 197 .long local_label(misc_ref_invalid) /* 88 even_fixnum */ 198 .long local_label(misc_ref_invalid) /* 89 cons */ 199 .long local_label(misc_ref_node) /* 8a value_cell */ 200 .long local_label(misc_ref_invalid) /* 8b imm */ 201 .long local_label(misc_ref_invalid) /* 8c odd_fixnum */ 202 .long local_label(misc_ref_invalid) /* 8d tra */ 203 .long local_label(misc_ref_invalid) /* 8e misc */ 204 .long local_label(misc_ref_invalid) /* 8f immheader */ 205 /* 90-9f */ 206 .long local_label(misc_ref_invalid) /* 90 even_fixnum */ 207 .long local_label(misc_ref_invalid) /* 91 cons */ 208 .long local_label(misc_ref_node) /* 92 xfunction */ 209 .long local_label(misc_ref_invalid) /* 93 imm */ 210 .long local_label(misc_ref_invalid) /* 94 odd_fixnum */ 211 .long local_label(misc_ref_invalid) /* 95 tra */ 212 .long local_label(misc_ref_invalid) /* 96 misc */ 213 .long local_label(misc_ref_invalid) /* 97 immheader */ 214 .long local_label(misc_ref_invalid) /* 98 even_fixnum */ 215 .long local_label(misc_ref_invalid) /* 99 cons */ 216 .long local_label(misc_ref_node) /* 9a arrayN */ 217 .long local_label(misc_ref_invalid) /* 9b imm */ 218 .long local_label(misc_ref_invalid) /* 9c odd_fixnum */ 219 .long local_label(misc_ref_invalid) /* 9d tra */ 220 .long local_label(misc_ref_invalid) /* 9e misc */ 221 .long local_label(misc_ref_invalid) /* 9f immheader */ 222 /* a0-af */ 223 .long local_label(misc_ref_invalid) /* a0 even_fixnum */ 224 .long local_label(misc_ref_invalid) /* a1 cons */ 225 .long local_label(misc_ref_node) /* a2 vectorH */ 226 .long local_label(misc_ref_invalid) /* a3 imm */ 227 .long local_label(misc_ref_invalid) /* a4 odd_fixnum */ 228 .long local_label(misc_ref_invalid) /* a5 tra */ 229 .long local_label(misc_ref_invalid) /* a6 misc */ 230 .long local_label(misc_ref_single_float_vector) /* a7 sf_vector */ 231 .long local_label(misc_ref_invalid) /* a8 even_fixnum */ 232 .long local_label(misc_ref_invalid) /* a9 cons */ 233 .long local_label(misc_ref_node) /* aa simple_vector */ 234 .long local_label(misc_ref_invalid) /* ab imm */ 235 .long local_label(misc_ref_invalid) /* ac odd_fixnum */ 236 .long local_label(misc_ref_invalid) /* ad tra */ 237 .long local_label(misc_ref_invalid) /* ae misc */ 238 .long local_label(misc_ref_u32) /* af u32 */ 239 /* b0-bf */ 240 .long local_label(misc_ref_invalid) /* b0 even_fixnum */ 241 .long local_label(misc_ref_invalid) /* b1 cons */ 242 .long local_label(misc_ref_invalid) /* b2 nodeheader */ 243 .long local_label(misc_ref_invalid) /* b3 imm */ 244 .long local_label(misc_ref_invalid) /* b4 odd_fixnum */ 245 .long local_label(misc_ref_invalid) /* b5 tra */ 246 .long local_label(misc_ref_invalid) /* b6 misc */ 247 .long local_label(misc_ref_s32) /* b7 s32 */ 248 .long local_label(misc_ref_invalid) /* b8 even_fixnum */ 249 .long local_label(misc_ref_invalid) /* b9 cons */ 250 .long local_label(misc_ref_invalid) /* ba nodeheader */ 251 .long local_label(misc_ref_invalid) /* bb imm */ 252 .long local_label(misc_ref_invalid) /* bc odd_fixnum */ 253 .long local_label(misc_ref_invalid) /* bd tra */ 254 .long local_label(misc_ref_invalid) /* be misc */ 255 .long local_label(misc_ref_fixnum_vector) /* bf fixnum_vector */ 256 /* c0-cf */ 257 .long local_label(misc_ref_invalid) /* c0 even_fixnum */ 258 .long local_label(misc_ref_invalid) /* c1 cons */ 259 .long local_label(misc_ref_invalid) /* c2 nodeheader */ 260 .long local_label(misc_ref_invalid) /* c3 imm */ 261 .long local_label(misc_ref_invalid) /* c4 odd_fixnum */ 262 .long local_label(misc_ref_invalid) /* c5 tra */ 263 .long local_label(misc_ref_invalid) /* c6 misc */ 264 .long local_label(misc_ref_string) /* c7 simple_base_string */ 265 .long local_label(misc_ref_invalid) /* c8 even_fixnum */ 266 .long local_label(misc_ref_invalid) /* c9 cons */ 267 .long local_label(misc_ref_invalid) /* ca nodeheader */ 268 .long local_label(misc_ref_invalid) /* cb imm */ 269 .long local_label(misc_ref_invalid) /* cc odd_fixnum */ 270 .long local_label(misc_ref_invalid) /* cd tra */ 271 .long local_label(misc_ref_invalid) /* ce misc */ 272 .long local_label(misc_ref_u8) /* cf u8 */ 273 /* d0-df */ 274 .long local_label(misc_ref_invalid) /* d0 even_fixnum */ 275 .long local_label(misc_ref_invalid) /* d1 cons */ 276 .long local_label(misc_ref_invalid) /* d2 nodeheader */ 277 .long local_label(misc_ref_invalid) /* d3 imm */ 278 .long local_label(misc_ref_invalid) /* d4 odd_fixnum */ 279 .long local_label(misc_ref_invalid) /* d5 tra */ 280 .long local_label(misc_ref_invalid) /* d6 misc */ 281 .long local_label(misc_ref_s8) /* d7 s8 */ 282 .long local_label(misc_ref_invalid) /* d8 even_fixnum */ 283 .long local_label(misc_ref_invalid) /* d9 cons */ 284 .long local_label(misc_ref_invalid) /* da nodeheader */ 285 .long local_label(misc_ref_invalid) /* db imm */ 286 .long local_label(misc_ref_invalid) /* dc odd_fixnum */ 287 .long local_label(misc_ref_invalid) /* dd tra */ 288 .long local_label(misc_ref_invalid) /* de misc */ 289 .long local_label(misc_ref_invalid) /* df immheader */ 290 /* e0-ef */ 291 .long local_label(misc_ref_invalid) /* e0 even_fixnum */ 292 .long local_label(misc_ref_invalid) /* e1 cons */ 293 .long local_label(misc_ref_invalid) /* e2 nodeheader */ 294 .long local_label(misc_ref_invalid) /* e3 imm */ 295 .long local_label(misc_ref_invalid) /* e4 odd_fixnum */ 296 .long local_label(misc_ref_invalid) /* e5 tra */ 297 .long local_label(misc_ref_invalid) /* e6 misc */ 298 .long local_label(misc_ref_u16) /* e7 u16 */ 299 .long local_label(misc_ref_invalid) /* e8 even_fixnum */ 300 .long local_label(misc_ref_invalid) /* e9 cons */ 301 .long local_label(misc_ref_invalid) /* ea nodeheader */ 302 .long local_label(misc_ref_invalid) /* eb imm */ 303 .long local_label(misc_ref_invalid) /* ec odd_fixnum */ 304 .long local_label(misc_ref_invalid) /* ed tra */ 305 .long local_label(misc_ref_invalid) /* ee misc */ 306 .long local_label(misc_ref_s16) /* ef s16 */ 307 /* f0-ff */ 308 .long local_label(misc_ref_invalid) /* f0 even_fixnum */ 309 .long local_label(misc_ref_invalid) /* f1 cons */ 310 .long local_label(misc_ref_invalid) /* f2 nodeheader */ 311 .long local_label(misc_ref_invalid) /* f3 imm */ 312 .long local_label(misc_ref_invalid) /* f4 odd_fixnum */ 313 .long local_label(misc_ref_invalid) /* f5 tra */ 314 .long local_label(misc_ref_invalid) /* f6 misc */ 315 .long local_label(misc_ref_double_float_vector) /* f7 df vector */ 316 .long local_label(misc_ref_invalid) /* f8 even_fixnum */ 317 .long local_label(misc_ref_invalid) /* f9 cons */ 318 .long local_label(misc_ref_invalid) /* fa nodeheader */ 319 .long local_label(misc_ref_invalid) /* fb imm */ 320 .long local_label(misc_ref_invalid) /* fc odd_fixnum */ 321 .long local_label(misc_ref_invalid) /* fd tra */ 322 .long local_label(misc_ref_invalid) /* fe misc */ 323 .long local_label(misc_ref_bit_vector) /* ff bit_vector */ 324 325 /* Functions are funny. The first N words are treated as */ 326 /* (UNSIGNED-BYTE 32), where N is the low 16 bits of the first word. */ 327 328 local_label(misc_ref_function): 329 __(movzwl misc_data_offset(%arg_y), %imm0) 330 __(shl $fixnumshift,%imm0) 331 __(rcmpl(%arg_z,%imm0)) 332 __(jb local_label(misc_ref_u32)) 333 local_label(misc_ref_node): 334 __(movl misc_data_offset(%arg_y,%arg_z),%arg_z) 335 __(ret) 336 local_label(misc_ref_u32): 337 __(movl misc_data_offset(%arg_y,%arg_z),%imm0) 338 __(jmp _SPmakeu32) 339 local_label(misc_ref_s32): 340 __(movl misc_data_offset(%arg_y,%arg_z),%imm0) 341 __(jmp _SPmakes32) 342 local_label(misc_ref_single_float_vector): 343 __(movss misc_data_offset(%arg_y,%arg_z),%fp1) 344 __(movl $single_float_header,%imm0) 345 __(movd %imm0,%mm0) 346 __(Misc_Alloc_Fixed(%arg_z,single_float.size)) 347 __(movss %fp1,single_float.value(%arg_z)) 348 __(ret) 349 local_label(misc_ref_double_float_vector): 350 __(movsd misc_dfloat_offset(%arg_y,%arg_z),%fp1) 351 __(movl $double_float_header,%imm0) 352 __(movd %imm0,%mm0) 353 __(Misc_Alloc_Fixed(%arg_z,double_float.size)) 354 __(movsd %fp1,double_float.value(%arg_z)) 355 __(ret) 356 local_label(misc_ref_fixnum_vector): 357 __(movl misc_data_offset(%arg_y,%arg_z),%imm0) 358 __(box_fixnum(%imm0,%arg_z)) 359 __(ret) 360 local_label(misc_ref_u8): 361 __(movl %arg_z,%imm0) 362 __(shr $2,%imm0) 363 __(movzbl misc_data_offset(%arg_y,%imm0),%imm0) 364 __(box_fixnum(%imm0,%arg_z)) 365 __(ret) 366 local_label(misc_ref_s8): 367 __(movl %arg_z,%imm0) 368 __(shr $2,%imm0) 369 __(movsbl misc_data_offset(%arg_y,%imm0),%imm0) 370 __(box_fixnum(%imm0,%arg_z)) 371 __(ret) 372 local_label(misc_ref_string): 373 __(movl %arg_z,%imm0) 374 __(movl misc_data_offset(%arg_y,%imm0),%imm0) 375 __(shll $charcode_shift,%imm0) 376 __(leal subtag_character(%imm0),%arg_z) 377 __(ret) 378 local_label(misc_ref_u16): 379 __(movl %arg_z,%imm0) 380 __(shrl $1,%imm0) 381 __(movzwl misc_data_offset(%arg_y,%imm0),%imm0) 382 __(box_fixnum(%imm0,%arg_z)) 383 __(ret) 384 local_label(misc_ref_s16): 385 __(movl %arg_z,%imm0) 386 __(shrl $1,%imm0) 387 __(movswl misc_data_offset(%arg_y,%imm0),%imm0) 388 __(box_fixnum(%imm0,%arg_z)) 389 __(ret) 390 local_label(misc_ref_bit_vector): 391 __(unbox_fixnum(%arg_z,%imm0)) 392 __(btl %imm0,misc_data_offset(%arg_y)) 393 __(setc %imm0_b) 394 __(movzbl %imm0_b,%imm0) 395 __(box_fixnum(%imm0,%arg_z)) 396 __(ret) 397 local_label(misc_ref_invalid): 398 __(push $XBADVEC) 399 __(set_nargs(3)) 400 __(jmp _SPksignalerr) 46 401 _endfn(C(misc_ref_common)) 47 402 403 /* Like misc_ref, only the boxed subtag is in temp0. */ 48 404 _spentry(subtag_misc_ref) 49 __(int $3) 405 __(mov %arg_y,%imm0) 406 __(and $tagmask,%imm0) 407 __(cmp $tag_misc,%imm0) 408 __(je,pt 0f) 409 __(uuo_error_reg_not_tag(Rarg_y,tag_misc)) 410 0: __(testb $fixnummask,%arg_z_b) 411 __(je,pt 1f) 412 __(uuo_error_reg_not_fixnum(Rarg_z)) 413 1: __(movl misc_header_offset(%arg_y),%imm0) 414 __(xorb %imm0_b,%imm0_b) 415 __(shrl $num_subtag_bits-fixnumshift,%imm0) 416 __(cmp %imm0,%arg_z) 417 __(jb 2f) 418 __(uuo_error_vector_bounds(Rarg_z,Rarg_y)) 419 2: __(unbox_fixnum(%temp0,%imm0)) 420 __(jmp C(misc_ref_common)) 50 421 _endsubp(subtag_misc_ref) 51 422 … … 92 463 93 464 /* Make a lisp integer (fixnum or one-digit bignum) from the value in %imm0 */ 94 /* This is slightly icky because we have only 1 immediate register */95 465 _spentry(makes32) 466 __(imull $fixnumone,%imm0,%arg_z) /* result is fixnum-tagged */ 467 __(jno 0f) /* but may have overflowed */ 96 468 __(movd %imm0,%mm1) 97 __(shll $fixnumshift, %imm0)98 __(movl %imm0,%arg_z)99 __(movd %mm1,%imm0)100 __(sarl $24,%imm0)101 __(movb %al,%ah)102 __(shlb $fixnumshift,%al)103 __(sarb $fixnumshift,%al)104 __(cmpb %al,%ah) /* high bits just sign? */105 __(je,pt 0f) /* yes, value fits in a fixnum */106 469 __(movl $one_digit_bignum_header,%imm0) 107 470 __(movd %imm0,%mm0) … … 182 545 /* double binding of *interrupt-level* out-of-line */ 183 546 _spentry(nmkunwind) 184 __(int $3) 547 __(movl %rcontext:tcr.tlb_pointer,%arg_z) 548 __(movl INTERRUPT_LEVEL_BINDING_INDEX(%arg_z),%arg_y) 549 __(push %arg_y) 550 __(push $INTERRUPT_LEVEL_BINDING_INDEX) 551 __(push %rcontext:tcr.db_link) 552 __(movl %esp,%rcontext:tcr.db_link) 553 __(movl $-1<<fixnumshift,INTERRUPT_LEVEL_BINDING_INDEX(%arg_z)) 554 __(movl $undefined,%arg_z) 555 /* %arg_z = tag, %xfn (%temp1) = pc */ 556 __(Make_Catch(fixnumone)) 557 __(movl %arg_y,%arg_z) 558 __(jmp _SPbind_interrupt_level) 185 559 _endsubp(nmkunwind) 186 560 … … 291 665 _endsubp(rplacd) 292 666 667 /* Storing into a gvector can be handles the same way as storing into a CONS. */ 293 668 /* args (src, unscaled-idx, val) in temp0, arg_y, arg_z */ 294 669 _spentry(gvset) 295 670 .globl C(egc_gvset) 296 671 C(egc_gvset): 297 __(int $3) 672 __(movl %arg_z,misc_data_offset(%temp0,%arg_y)) 673 __(rcmpl(%arg_z,%temp0)) 674 __(ja 1f) 675 0: __(repret) 676 1: __(lea misc_data_offset(%temp0,%arg_y),%imm0) 677 __(subl lisp_global(heap_start),%imm0) 678 __(shrl $dnode_shift,%imm0) 679 __(cmpl lisp_global(oldspace_dnode_count),%imm0) 680 __(jae 0b) 681 __(andl $~(1<<bitmap_shift-1),%temp0) 682 __(shrl $bitmap_shift-fixnumshift,%temp0) 683 __(andl $31,%imm0) 684 __(addl lisp_global(refbits),%temp0) 685 __(xorb $31,%imm0_b) 686 __(lock) 687 __(btsl %imm0,(%temp0)) 688 __(ret) 298 689 _endsubp(gvset) 299 690 … … 440 831 441 832 /* Have to be a little careful here: the caller may or may not have pushed */ 442 /* an empty frame, and we may or may not have needed one. We can't easily */443 /* tell whether or not a frame will be needed (if the caller didn't reserve */444 /* a frame, whether or not we need one depends on the length of the list */445 /* in arg_z. So, if the caller didn't push a frame, we do so ; once everything's*/446 /* been spread, we discard the reserved frame (regardless of who pushed it) */447 /* if all args fit in registers. */833 /* an empty frame, and we may or may not have needed one. We can't easily */ 834 /* tell whether or not a frame will be needed (if the caller didn't reserve */ 835 /* a frame, whether or not we need one depends on the length of the list */ 836 /* in arg_z. So, if the caller didn't push a frame, we do so; once */ 837 /* everything's been spread, we discard the reserved frame (regardless of 838 /* who pushed it) if all args fit in registers. */ 448 839 _spentry(spreadargz) 449 840 __(int $3) … … 541 932 /* is the same as arg_z's. If not an integer, error. */ 542 933 _spentry(integer_sign) 934 __(mov %arg_z,%imm0) 543 935 __(testb $tagmask,%arg_z_b) 544 __(mov %arg_z,%imm0)545 936 __(je 8f) 546 937 __(extract_typecode(%arg_z,%imm0)) … … 656 1047 657 1048 _spentry(specrefcheck) 1049 __(movl %rcontext:tcr.tlb_pointer,%temp1) 1050 __(mov %arg_z,%arg_y) 658 1051 __(movl symbol.binding_index(%arg_z),%imm0) 659 1052 __(cmp %rcontext:tcr.tlb_limit,%imm0) 660 __(movl %rcontext:tcr.tlb_pointer,%temp1)661 __(mov %arg_z,%arg_y)662 1053 __(jae 7f) 663 1054 __(movl (%temp1,%imm0),%arg_z) … … 704 1095 705 1096 _spentry(bind_interrupt_level_0) 706 __(int $3) 1097 __(movl %rcontext:tcr.tlb_pointer,%arg_y) 1098 __(cmpl $0,INTERRUPT_LEVEL_BINDING_INDEX(%arg_y)) 1099 __(push INTERRUPT_LEVEL_BINDING_INDEX(%arg_y)) 1100 __(push $INTERRUPT_LEVEL_BINDING_INDEX) 1101 __(push %rcontext:tcr.db_link) 1102 __(movl %esp,%rcontext:tcr.db_link) 1103 __(movl $0,INTERRUPT_LEVEL_BINDING_INDEX(%arg_y)) 1104 __(js,pn 1f) 1105 0: __(jmp *%ra0) 1106 /* Interrupt level was negative; interrupt may be pending */ 1107 1: __(check_pending_enabled_interrupt(2f)) 1108 2: __(jmp *%ra0) 707 1109 _endsubp(bind_interrupt_level_0) 708 1110 … … 711 1113 _endsubp(bind_interrupt_level_m1) 712 1114 1115 /* Bind CCL::*INTERRUPT-LEVEL* to the value in arg_z. If that value's 0, */ 1116 /* do what _SPbind_interrupt_level_0 does. */ 713 1117 _spentry(bind_interrupt_level) 714 __(int $3) 1118 __(test %arg_z,%arg_z) 1119 __(jz _SPbind_interrupt_level_0) 1120 __(movl %rcontext:tcr.tlb_pointer,%arg_y) 1121 __(push INTERRUPT_LEVEL_BINDING_INDEX(%arg_y)) 1122 __(push $INTERRUPT_LEVEL_BINDING_INDEX) 1123 __(push %rcontext:tcr.db_link) 1124 __(movl %esp,%rcontext:tcr.db_link) 1125 __(movl %arg_z,INTERRUPT_LEVEL_BINDING_INDEX(%arg_y)) 1126 __(jmp *%ra0) 715 1127 _endsubp(bind_interrupt_level) 716 1128 … … 723 1135 _endsubp(progvrestore) 724 1136 1137 /* %arg_z <- %arg_y + %arg_z. Do the fixnum case - including overflow - */ 1138 /* inline. Call out otherwise. */ 725 1139 _spentry(builtin_plus) 726 __(int $3) 1140 __(movl %arg_y,%imm0) 1141 __(orl %arg_z,%imm0) 1142 __(testb $fixnummask,%imm0_b) 1143 __(jne 1f) 1144 __(addl %arg_y,%arg_z) 1145 __(jo,pn C(fix_one_bit_overflow)) 1146 __(repret) 1147 1: __(jump_builtin(_builtin_plus,2)) 727 1148 _endsubp(builtin_plus) 728 1149 … … 815 1236 816 1237 _spentry(builtin_length) 817 __(int $3) 1238 __(extract_fulltag(%arg_z,%imm0)) 1239 __(cmpl $tag_list,%imm0) 1240 __(jz 2f) 1241 __(andl $tagmask,%imm0) 1242 __(cmpl $tag_misc,%imm0) 1243 __(jnz 8f) 1244 __(extract_subtag(%arg_z,%imm0_b)) 1245 __(rcmpb(%imm0_b,$min_vector_subtag)) 1246 __(jb 8f) 1247 __(je 1f) 1248 /* (simple-array * (*)) */ 1249 __(movl %arg_z,%arg_y) 1250 __(vector_length(%arg_y,%arg_z)) 1251 __(ret) 1252 1: /* vector header */ 1253 __(movl vectorH.logsize(%arg_z),%arg_z) 1254 __(ret) 1255 2: /* list. Maybe null, maybe dotted or circular. */ 1256 __(movl $-fixnumone,%arg_y) 1257 __(movl %arg_z,%temp0) /* fast pointer */ 1258 __(movl %arg_z,%temp1) /* slow pointer */ 1259 3: __(movb %temp0_b,%al) 1260 __(andb $fulltagmask,%al) 1261 __(addl $fixnumone,%arg_y) 1262 __(compare_reg_to_nil(%temp0)) 1263 __(je 9f) 1264 __(cmpb $fulltag_cons,%al) 1265 __(jne 8f) 1266 __(movb %temp1_b,%ah) 1267 __(andb $fulltagmask,%ah) 1268 __(_cdr(%temp0,%temp0)) 1269 __(testl $fixnumone,%arg_y) 1270 __(je 3b) 1271 __(cmpb $fulltag_cons,%ah) 1272 __(jne 8f) 1273 __(_cdr(%temp1,%temp1)) 1274 __(cmpl %temp0,%temp1) 1275 __(jne 3b) 1276 8: 1277 __(jump_builtin(_builtin_length,1)) 1278 9: 1279 __(movl %arg_y,%arg_z) 1280 __(ret) 818 1281 _endsubp(builtin_length) 819 1282 … … 889 1352 _spentry(builtin_aref1) 890 1353 __(extract_typecode(%arg_y,%imm0)) 1354 __(box_fixnum_no_flags(%imm0,%temp0)) 891 1355 __(cmpb $min_vector_subtag,%imm0_b) 892 __(box_fixnum_no_flags(%imm0,%arg_y))893 1356 __(ja _SPsubtag_misc_ref) 894 1357 __(jump_builtin(_builtin_aref1,2))
Note:
See TracChangeset
for help on using the changeset viewer.
