Changeset 8068
- Timestamp:
- Jan 14, 2008, 6:48:59 PM (17 years ago)
- Location:
- branches/ia32/lisp-kernel
- Files:
-
- 3 edited
-
x86-constants32.s (modified) (7 diffs)
-
x86-spentry32.s (modified) (9 diffs)
-
x86-subprims32.s (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/ia32/lisp-kernel/x86-constants32.s
r7286 r8068 1 define([eax_l],[eax]) 2 define([ecx_l],[ecx]) 3 define([edx_l],[edx]) 4 define([ebx_l],[ebx]) 5 define([esi_l],[esi]) 6 define([edi_l],[edi]) 7 8 define([eax_b],[al]) 9 define([ecx_b],[cl]) 10 define([edx_b],[dl]) 11 define([ebx_b],[bl]) 12 1 13 define([imm0],[eax]) 14 define([imm0_l],[eax]) 15 define([imm0_w],[ax]) 16 define([imm0_b],[al]) 17 define([Rimm0],[0]) 18 2 19 define([temp0],[ecx]) 20 define([temp0_l],[ecx]) 21 define([temp0_w],[cx]) 22 define([temp0_b],[cl]) 23 define([Rtemp0],[1]) 24 3 25 define([temp1],[edx]) 26 define([temp1_l],[edx]) 27 define([temp1_w],[dx]) 28 define([temp1_b],[dl]) 29 define([Rtemp1],[2]) 30 4 31 define([arg_z],[ebx]) 32 define([arg_z_l],[ebx]) 33 define([arg_z_w],[bx]) 34 define([arg_z_b],[bl]) 35 define([Rarg_z],[3]) 36 5 37 define([arg_y],[esi]) 38 define([Rarg_y],[6]) 39 6 40 define([fn],[edi]) 41 define([Rfn],[7]) 7 42 8 43 define([rcontext],[fs]) 9 10 44 define([fname],[temp0]) 11 45 define([allocptr],[temp0]) 46 47 define([nargs_b],[imm0_b]) 48 define([nargs],[imm0_w]) 49 define([nargs_l],[imm0]) 50 51 define([ra0],[temp0]) 52 define([xfn],[temp1]) 53 54 define([allocptr],[temp0]) 55 define([stack_temp],[mm7]) 12 56 13 57 define([fp0],[xmm0]) … … 27 71 nfixnumtagbits = 2 28 72 num_subtag_bits = 8 73 subtag_shift = num_subtag_bits 29 74 fixnumshift = 2 30 75 fixnum_shift = 2 … … 185 230 _node(foreign_sp) /* necessary? */ 186 231 _node(db_link) /* head of special-binding chain */ 187 _node(_save3) /* saved nvrs (probably won't have any on IA-32 */188 _node(_save2)189 _node(_save1)190 _node(_save0)191 232 _node(xframe) /* exception frame chain */ 192 233 _node(pc) /* TRA of catch exit or cleanup form */ … … 431 472 432 473 _struct(tcr,TCR_BIAS) 474 _node(next) /* in doubly-linked list */ 433 475 _node(prev) /* in doubly-linked list */ 434 _node(next) /* in doubly-linked list */435 476 _word(node_regs_mask) 436 477 _node(linear) /* our linear (non-segment-based) address. */ 478 _node(save0) /* spill area for node registers (16-byte aligned ) */ 479 _node(save1) 480 _node(save2) 481 _node(save3) 437 482 _node(save_ebp) /* lisp EBP when in foreign code */ 438 483 _word(lisp_mxcsr) … … 447 492 _node(ts_area) /* tstack area pointer */ 448 493 _node(cs_limit) /* cstack overflow limit */ 449 _word(bytes_ consed_low)494 _word(bytes_allocated) 450 495 _word(bytes_consed_high) 451 496 _node(log2_allocation_quantum) … … 478 523 _node(next_tsp) 479 524 _node(safe_ref_address) 480 _word(ldt_index)481 525 _word(ldt_selector) 482 526 _ends … … 496 540 497 541 INTERRUPT_LEVEL_BINDING_INDEX = fixnumone 542 -
branches/ia32/lisp-kernel/x86-spentry32.s
r7358 r8068 1 1 include(lisp.s) 2 _beginfile3 2 4 3 .align 2 … … 6 5 .p2align 3 7 6 _exportfn(_SP$1) 8 .line __line__9 7 ]) 10 8 11 9 define([_endsubp],[ 12 10 _endfn(_SP$1) 13 # __line__14 11 ]) 15 12 … … 39 36 __(ret) 40 37 _endsubp(fix_overflow) 38 39 _spentry(misc_ref) 40 __(int $3) 41 _endsubp(misc_ref) 42 43 _startfn(C(misc_ref_common)) 44 __(int $3) 45 _endfn(C(misc_ref_common)) 46 47 _spentry(subtag_misc_ref) 48 __(int $3) 49 _endsubp(subtag_misc_ref) 50 51 _spentry(subtag_misc_set) 52 __(int $3) 53 _endsubp(subtag_misc_set) 54 55 _spentry(misc_set) 56 __(int $3) 57 _endsubp(misc_set) 58 59 _startfn(C(misc_set_common)) 60 __(ret) 61 _endfn(C(misc_set_common)) 62 63 _spentry(Fret1valn) 64 .globl C(ret1valn) 65 __(tra(C(ret1valn))) 66 __(mov (%esp),%ra0) 67 __(mov %arg_z,(%esp)) 68 __(set_nargs(1)) 69 __(jmp *%ra0) 70 _endsubp(Fret1valn) 71 72 _spentry(nvalret) 73 .globl C(nvalret) 74 C(nvalret): 75 __(leave) 76 __(ret) 77 _endsubp(nvalret) 78 79 _spentry(jmpsym) 80 __(jump_fname()) 81 _endsubp(jmpsym) 82 83 _spentry(jmpnfn) 84 __(mov %temp0,%fn) 85 __(jmp *%fn) 86 _endsubp(jmpnfn) 87 88 _spentry(funcall) 89 __(do_funcall()) 90 _endsubp(funcall) 41 91 42 92 /* Make a lisp integer (fixnum or one-digit bignum) from the value in %imm0 */ … … 59 109 0: __(repret) 60 110 _endsubp(makes32) 61 111 112 _spentry(makes64) 113 __(int $3) 114 _endsubp(makes64) 115 116 /* xxx make lisp integer out of mm0 */ 62 117 /* Make a lisp integer (probably a bignum) out of the %edx:%eax pair. */ 63 118 /* We assume that the node_regs_mask in the TCR has been set to mark */ … … 77 132 _endfn 78 133 79 /* %arg_y = uvector, %arg_z = index */ 80 /* subtag in %imm0.b */ 81 _startfn(C(misc_ref_common)) 82 .p2align 2 83 local_label(misc_ref_jmp): 84 /* 00-0f */ 85 .long local_label(misc_ref_invalid) /* 00 even_fixnum */ 86 .long local_label(misc_ref_invalid) /* 01 cons */ 87 .long local_label(misc_ref_invalid) /* 02 nodeheader */ 88 .long local_label(misc_ref_invalid) /* 03 imm */ 89 .long local_label(misc_ref_invalid) /* 04 odd_fixnum */ 90 .long local_label(misc_ref_invalid) /* 05 tra */ 91 .long local_label(misc_ref_invalid) /* 06 misc */ 92 .long local_label(misc_ref_u32) /* 07 bignum */ 93 .long local_label(misc_ref_invalid) /* 08 even_fixnum */ 94 .long local_label(misc_ref_invalid) /* 09 cons */ 95 .long local_label(misc_ref_node) /* 0a ratio */ 96 .long local_label(misc_ref_invalid) /* 0b imm */ 97 .long local_label(misc_ref_invalid) /* 0c odd_fixnum */ 98 .long local_label(misc_ref_invalid) /* 0d nil */ 99 .long local_label(misc_ref_invalid) /* 0e misc */ 100 .long local_label(misc_ref_u32) /* 0f single_float */ 101 /* 10-1f */ 102 .long local_label(misc_ref_invalid) /* 10 even_fixnum */ 103 .long local_label(misc_ref_invalid) /* 11 cons */ 104 .long local_label(misc_ref_invalid) /* 12 nodeheader */ 105 .long local_label(misc_ref_invalid) /* 13 imm */ 106 .long local_label(misc_ref_invalid) /* 14 odd_fixnum */ 107 .long local_label(misc_ref_invalid) /* 15 tra */ 108 .long local_label(misc_ref_invalid) /* 16 misc */ 109 .long local_label(misc_ref_u32) /* 17 double_float */ 110 .long local_label(misc_ref_invalid) /* 18 even_fixnum */ 111 .long local_label(misc_ref_invalid) /* 19 cons */ 112 .long local_label(misc_ref_node) /* 1a complex */ 113 .long local_label(misc_ref_invalid) /* 1b imm */ 114 .long local_label(misc_ref_invalid) /* 1c odd_fixnum */ 115 .long local_label(misc_ref_invalid) /* 1d nil */ 116 .long local_label(misc_ref_invalid) /* 1e misc */ 117 .long local_label(misc_ref_u32) /* 1f macptr */ 118 /* 20-2f */ 119 .long local_label(misc_ref_invalid) /* 20 even_fixnum */ 120 .long local_label(misc_ref_invalid) /* 21 cons */ 121 .long local_label(misc_ref_node) /* 22 catch_frame */ 122 .long local_label(misc_ref_invalid) /* 23 imm */ 123 .long local_label(misc_ref_invalid) /* 24 odd_fixnum */ 124 .long local_label(misc_ref_invalid) /* 25 tra */ 125 .long local_label(misc_ref_invalid) /* 26 misc */ 126 .long local_label(misc_ref_u32) /* 27 dead_macptr */ 127 .long local_label(misc_ref_invalid) /* 28 even_fixnum */ 128 .long local_label(misc_ref_invalid) /* 29 cons */ 129 .long local_label(misc_ref_node) /* 2a function */ 130 .long local_label(misc_ref_invalid) /* 2b imm */ 131 .long local_label(misc_ref_invalid) /* 2c odd_fixnum */ 132 .long local_label(misc_ref_invalid) /* 2d nil */ 133 .long local_label(misc_ref_invalid) /* 2e misc */ 134 .long local_label(misc_ref_u32) /* 2f code_vector */ 135 /* 30-3f */ 136 .long local_label(misc_ref_invalid) /* 30 even_fixnum */ 137 .long local_label(misc_ref_invalid) /* 31 cons */ 138 .long local_label(misc_ref_node) /* 32 lisp_thread */ 139 .long local_label(misc_ref_invalid) /* 33 imm */ 140 .long local_label(misc_ref_invalid) /* 34 odd_fixnum */ 141 .long local_label(misc_ref_invalid) /* 35 tra */ 142 .long local_label(misc_ref_invalid) /* 36 misc */ 143 .long local_label(misc_ref_u32) /* 37 creole */ 144 .long local_label(misc_ref_invalid) /* 38 even_fixnum */ 145 .long local_label(misc_ref_invalid) /* 39 cons */ 146 .long local_label(misc_ref_node) /* 3a symbol */ 147 .long local_label(misc_ref_invalid) /* 3b imm */ 148 .long local_label(misc_ref_invalid) /* 3c odd_fixnum */ 149 .long local_label(misc_ref_invalid) /* 3d nil */ 150 .long local_label(misc_ref_invalid) /* 3e misc */ 151 .long local_label(misc_ref_u32) /* 3f xcode_vector */ 152 /* 40-4f */ 153 .long local_label(misc_ref_invalid) /* 40 even_fixnum */ 154 .long local_label(misc_ref_invalid) /* 41 cons */ 155 .long local_label(misc_ref_node) /* 42 lock */ 156 .long local_label(misc_ref_invalid) /* 43 imm */ 157 .long local_label(misc_ref_invalid) /* 44 odd_fixnum */ 158 .long local_label(misc_ref_invalid) /* 45 tra */ 159 .long local_label(misc_ref_invalid) /* 46 misc */ 160 .long local_label(misc_ref_invalid) /* 47 immheader */ 161 .long local_label(misc_ref_invalid) /* 48 even_fixnum */ 162 .long local_label(misc_ref_invalid) /* 49 cons */ 163 .long local_label(misc_ref_node) /* 4a hash_vector */ 164 .long local_label(misc_ref_invalid) /* 4b imm */ 165 .long local_label(misc_ref_invalid) /* 4c odd_fixnum */ 166 .long local_label(misc_ref_invalid) /* 4d tra */ 167 .long local_label(misc_ref_invalid) /* 4e misc */ 168 .long local_label(misc_ref_invalid) /* 4f immheader */ 169 /* 50-5f */ 170 .long local_label(misc_ref_invalid) /* 50 even_fixnum */ 171 .long local_label(misc_ref_invalid) /* 51 cons */ 172 .long local_label(misc_ref_node) /* 52 pool */ 173 .long local_label(misc_ref_invalid) /* 53 imm */ 174 .long local_label(misc_ref_invalid) /* 54 odd_fixnum */ 175 .long local_label(misc_ref_invalid) /* 55 tra */ 176 .long local_label(misc_ref_invalid) /* 56 misc */ 177 .long local_label(misc_ref_invalid) /* 57 immheader */ 178 .long local_label(misc_ref_invalid) /* 58 even_fixnum */ 179 .long local_label(misc_ref_invalid) /* 59 cons */ 180 .long local_label(misc_ref_node) /* 5a weak */ 181 .long local_label(misc_ref_invalid) /* 5b imm */ 182 .long local_label(misc_ref_invalid) /* 5c odd_fixnum */ 183 .long local_label(misc_ref_invalid) /* 5d nil */ 184 .long local_label(misc_ref_invalid) /* 5e misc */ 185 .long local_label(misc_ref_invalid) /* 5f immheader */ 186 /* 60-6f */ 187 .long local_label(misc_ref_invalid) /* 60 even_fixnum */ 188 .long local_label(misc_ref_invalid) /* 61 cons */ 189 .long local_label(misc_ref_node) /* 62 package */ 190 .long local_label(misc_ref_invalid) /* 63 imm */ 191 .long local_label(misc_ref_invalid) /* 64 odd_fixnum */ 192 .long local_label(misc_ref_invalid) /* 65 tra */ 193 .long local_label(misc_ref_invalid) /* 66 misc */ 194 .long local_label(misc_ref_invalid) /* 67 immheader */ 195 .long local_label(misc_ref_invalid) /* 68 even_fixnum */ 196 .long local_label(misc_ref_invalid) /* 69 cons */ 197 .long local_label(misc_ref_node) /* 6a slot_vector */ 198 .long local_label(misc_ref_invalid) /* 6b imm */ 199 .long local_label(misc_ref_invalid) /* 6c odd_fixnum */ 200 .long local_label(misc_ref_invalid) /* 6d tra */ 201 .long local_label(misc_ref_invalid) /* 6e misc */ 202 .long local_label(misc_ref_invalid) /* 6f immheader */ 203 /* 70-7f */ 204 .long local_label(misc_ref_invalid) /* 70 even_fixnum */ 205 .long local_label(misc_ref_invalid) /* 71 cons */ 206 .long local_label(misc_ref_node) /* 72 instance */ 207 .long local_label(misc_ref_invalid) /* 73 imm */ 208 .long local_label(misc_ref_invalid) /* 74 odd_fixnum */ 209 .long local_label(misc_ref_invalid) /* 75 tra */ 210 .long local_label(misc_ref_invalid) /* 76 misc */ 211 .long local_label(misc_ref_invalid) /* 77 immheader */ 212 .long local_label(misc_ref_invalid) /* 78 even_fixnum */ 213 .long local_label(misc_ref_invalid) /* 79 cons */ 214 .long local_label(misc_ref_node) /* 7a struct */ 215 .long local_label(misc_ref_invalid) /* 7b imm */ 216 .long local_label(misc_ref_invalid) /* 7c odd_fixnum */ 217 .long local_label(misc_ref_invalid) /* 7d tra */ 218 .long local_label(misc_ref_invalid) /* 7e misc */ 219 .long local_label(misc_ref_invalid) /* 7f immheader */ 220 /* 80-8f */ 221 .long local_label(misc_ref_invalid) /* 80 even_fixnum */ 222 .long local_label(misc_ref_invalid) /* 81 cons */ 223 .long local_label(misc_ref_node) /* 82 istruct */ 224 .long local_label(misc_ref_invalid) /* 83 imm */ 225 .long local_label(misc_ref_invalid) /* 84 odd_fixnum */ 226 .long local_label(misc_ref_invalid) /* 85 tra */ 227 .long local_label(misc_ref_invalid) /* 86 misc */ 228 .long local_label(misc_ref_invalid) /* 87 immheader */ 229 .long local_label(misc_ref_invalid) /* 88 even_fixnum */ 230 .long local_label(misc_ref_invalid) /* 89 cons */ 231 .long local_label(misc_ref_node) /* 8a value_cell */ 232 .long local_label(misc_ref_invalid) /* 8b imm */ 233 .long local_label(misc_ref_invalid) /* 8c odd_fixnum */ 234 .long local_label(misc_ref_invalid) /* 8d tra */ 235 .long local_label(misc_ref_invalid) /* 8e misc */ 236 .long local_label(misc_ref_invalid) /* 8f immheader */ 237 /* 90-9f */ 238 .long local_label(misc_ref_invalid) /* 90 even_fixnum */ 239 .long local_label(misc_ref_invalid) /* 91 cons */ 240 .long local_label(misc_ref_node) /* 92 xfunction */ 241 .long local_label(misc_ref_invalid) /* 93 imm */ 242 .long local_label(misc_ref_invalid) /* 94 odd_fixnum */ 243 .long local_label(misc_ref_invalid) /* 95 tra */ 244 .long local_label(misc_ref_invalid) /* 96 misc */ 245 .long local_label(misc_ref_invalid) /* 97 immheader */ 246 .long local_label(misc_ref_invalid) /* 98 even_fixnum */ 247 .long local_label(misc_ref_invalid) /* 99 cons */ 248 .long local_label(misc_ref_node) /* 9a arrayN */ 249 .long local_label(misc_ref_invalid) /* 9b imm */ 250 .long local_label(misc_ref_invalid) /* 9c odd_fixnum */ 251 .long local_label(misc_ref_invalid) /* 9d tra */ 252 .long local_label(misc_ref_invalid) /* 9e misc */ 253 .long local_label(misc_ref_invalid) /* 9f immheader */ 254 /* a0-af */ 255 .long local_label(misc_ref_invalid) /* a0 even_fixnum */ 256 .long local_label(misc_ref_invalid) /* a1 cons */ 257 .long local_label(misc_ref_node) /* a2 vectorH */ 258 .long local_label(misc_ref_invalid) /* a3 imm */ 259 .long local_label(misc_ref_invalid) /* a4 odd_fixnum */ 260 .long local_label(misc_ref_invalid) /* a5 tra */ 261 .long local_label(misc_ref_invalid) /* a6 misc */ 262 .long local_label(misc_ref_single_float_vector) /* a7 sf_vector */ 263 .long local_label(misc_ref_invalid) /* a8 even_fixnum */ 264 .long local_label(misc_ref_invalid) /* a9 cons */ 265 .long local_label(misc_ref_node) /* aa simple_vector */ 266 .long local_label(misc_ref_invalid) /* ab imm */ 267 .long local_label(misc_ref_invalid) /* ac odd_fixnum */ 268 .long local_label(misc_ref_invalid) /* ad tra */ 269 .long local_label(misc_ref_invalid) /* ae misc */ 270 .long local_label(misc_ref_u32) /* af u32 */ 271 /* b0-bf */ 272 .long local_label(misc_ref_invalid) /* b0 even_fixnum */ 273 .long local_label(misc_ref_invalid) /* b1 cons */ 274 .long local_label(misc_ref_invalid) /* b2 nodeheader */ 275 .long local_label(misc_ref_invalid) /* b3 imm */ 276 .long local_label(misc_ref_invalid) /* b4 odd_fixnum */ 277 .long local_label(misc_ref_invalid) /* b5 tra */ 278 .long local_label(misc_ref_invalid) /* b6 misc */ 279 .long local_label(misc_ref_s32) /* b7 s32 */ 280 .long local_label(misc_ref_invalid) /* b8 even_fixnum */ 281 .long local_label(misc_ref_invalid) /* b9 cons */ 282 .long local_label(misc_ref_invalid) /* ba nodeheader */ 283 .long local_label(misc_ref_invalid) /* bb imm */ 284 .long local_label(misc_ref_invalid) /* bc odd_fixnum */ 285 .long local_label(misc_ref_invalid) /* bd tra */ 286 .long local_label(misc_ref_invalid) /* be misc */ 287 .long local_label(misc_ref_fixnum_vector) /* bf fixnum_vector */ 288 /* c0-cf */ 289 .long local_label(misc_ref_invalid) /* c0 even_fixnum */ 290 .long local_label(misc_ref_invalid) /* c1 cons */ 291 .long local_label(misc_ref_invalid) /* c2 nodeheader */ 292 .long local_label(misc_ref_invalid) /* c3 imm */ 293 .long local_label(misc_ref_invalid) /* c4 odd_fixnum */ 294 .long local_label(misc_ref_invalid) /* c5 tra */ 295 .long local_label(misc_ref_invalid) /* c6 misc */ 296 .long local_label(misc_ref_new_string) /* c7 new_string */ 297 .long local_label(misc_ref_invalid) /* c8 even_fixnum */ 298 .long local_label(misc_ref_invalid) /* c9 cons */ 299 .long local_label(misc_ref_invalid) /* ca nodeheader */ 300 .long local_label(misc_ref_invalid) /* cb imm */ 301 .long local_label(misc_ref_invalid) /* cc odd_fixnum */ 302 .long local_label(misc_ref_invalid) /* cd tra */ 303 .long local_label(misc_ref_invalid) /* ce misc */ 304 .long local_label(misc_ref_u8) /* cf u8 */ 305 /* d0-df */ 306 .long local_label(misc_ref_invalid) /* d0 even_fixnum */ 307 .long local_label(misc_ref_invalid) /* d1 cons */ 308 .long local_label(misc_ref_invalid) /* d2 nodeheader */ 309 .long local_label(misc_ref_invalid) /* d3 imm */ 310 .long local_label(misc_ref_invalid) /* d4 odd_fixnum */ 311 .long local_label(misc_ref_invalid) /* d5 tra */ 312 .long local_label(misc_ref_invalid) /* d6 misc */ 313 .long local_label(misc_ref_s8) /* d7 s8 */ 314 .long local_label(misc_ref_invalid) /* d8 even_fixnum */ 315 .long local_label(misc_ref_invalid) /* d9 cons */ 316 .long local_label(misc_ref_invalid) /* da nodeheader */ 317 .long local_label(misc_ref_invalid) /* db imm */ 318 .long local_label(misc_ref_invalid) /* dc odd_fixnum */ 319 .long local_label(misc_ref_invalid) /* dd tra */ 320 .long local_label(misc_ref_invalid) /* de misc */ 321 .long local_label(misc_ref_old_string) /* df (old)subtag_simple_base_string */ 322 /* e0-ef */ 323 .long local_label(misc_ref_invalid) /* e0 even_fixnum */ 324 .long local_label(misc_ref_invalid) /* e1 cons */ 325 .long local_label(misc_ref_invalid) /* e2 nodeheader */ 326 .long local_label(misc_ref_invalid) /* e3 imm */ 327 .long local_label(misc_ref_invalid) /* e4 odd_fixnum */ 328 .long local_label(misc_ref_invalid) /* e5 tra */ 329 .long local_label(misc_ref_invalid) /* e6 misc */ 330 .long local_label(misc_ref_u16) /* e7 u16 */ 331 .long local_label(misc_ref_invalid) /* e8 even_fixnum */ 332 .long local_label(misc_ref_invalid) /* e9 cons */ 333 .long local_label(misc_ref_invalid) /* ea nodeheader */ 334 .long local_label(misc_ref_invalid) /* eb imm */ 335 .long local_label(misc_ref_invalid) /* ec odd_fixnum */ 336 .long local_label(misc_ref_invalid) /* ed tra */ 337 .long local_label(misc_ref_invalid) /* ee misc */ 338 .long local_label(misc_ref_s16) /* ef s16 */ 339 /* f0-ff */ 340 .long local_label(misc_ref_invalid) /* f0 even_fixnum */ 341 .long local_label(misc_ref_invalid) /* f1 cons */ 342 .long local_label(misc_ref_invalid) /* f2 nodeheader */ 343 .long local_label(misc_ref_invalid) /* f3 imm */ 344 .long local_label(misc_ref_invalid) /* f4 odd_fixnum */ 345 .long local_label(misc_ref_invalid) /* f5 tra */ 346 .long local_label(misc_ref_invalid) /* f6 misc */ 347 .long local_label(misc_ref_double_float_vector) /* f7 df vector */ 348 .long local_label(misc_ref_invalid) /* f8 even_fixnum */ 349 .long local_label(misc_ref_invalid) /* f9 cons */ 350 .long local_label(misc_ref_invalid) /* fa nodeheader */ 351 .long local_label(misc_ref_invalid) /* fb imm */ 352 .long local_label(misc_ref_invalid) /* fc odd_fixnum */ 353 .long local_label(misc_ref_invalid) /* fd tra */ 354 .long local_label(misc_ref_invalid) /* fe misc */ 355 .long local_label(misc_ref_bit_vector) /* ff bit_vector */ 356 local_label(misc_ref_invalid): 134 135 _spentry(syscall) 136 /* Save lisp registers */ 137 __(push %ebp) 138 __(movl %esp,%ebp) 139 __(push %temp0) 140 __(push %temp1) 141 __(push %arg_y) 142 __(push %arg_z) 143 __(push %fn) 144 __(movl %esp,%rcontext:tcr.save_vsp) 145 __(movl %ebp,%rcontext:tcr.save_ebp) 146 __(movl $TCR_STATE_FOREIGN,%rcontext:tcr.valence) 147 __(movl %rcontext:tcr.foreign_sp,%esp) 148 __(emms) 149 __(movl (%esp),%ebp) 150 __(addl $2*node_size,%esp) 151 __(unbox_fixnum(%arg_z,%eax)) 152 /* push syscall args on stack */ 153 __(int $0x80) 154 __(movl %ebp,%esp) 155 __(movl %esp,%rcontext:tcr.foreign_sp) 156 __(zero_node_regs) 157 __(pxor %fpzero,%fpzero) 158 __(movl %rcontext:tcr.save_vsp,%esp) 159 __(movl %rcontext:tcr.save_ebp,%ebp) 160 __(movl $TCR_STATE_LISP,%rcontext:tcr.valence) 161 __(pop %fn) 162 __(pop %arg_z) 163 __(pop %arg_y) 164 __(pop %temp1) 165 __(check_pending_interrupt(%temp0)) 166 __(push %temp0) 167 __(leave) 168 __(ret) 169 _endsubp(syscall) 170 171 _spentry(mkcatch1v) 172 __(nMake_Catch(0)) 173 __(ret) 174 _endsubp(mkcatch1v) 175 176 _spentry(mkunwind) 177 __(int $3) 178 _endsubp(mkunwind) 179 180 /* this takes a return address in %ra0; it's "new" in that it does the */ 181 /* double binding of *interrupt-level* out-of-line */ 182 _spentry(nmkunwind) 183 __(int $3) 184 _endsubp(nmkunwind) 185 186 _spentry(mkcatchmv) 187 __(int $3) 188 _endsubp(mkcatchmv) 189 190 _spentry(throw) 191 __(int $3) 192 _endsubp(throw) 193 194 /* This takes N multiple values atop the vstack. */ 195 _spentry(nthrowvalues) 196 __(int $3) 197 _endsubp(nthrowvalues) 198 199 /* This is a (slight) optimization. When running an unwind-protect, */ 200 /* save the single value and the throw count in the tstack frame. */ 201 /* Note that this takes a single value in arg_z. */ 202 203 _spentry(nthrow1value) 204 __(int $3) 205 _endsubp(nthrow1value) 206 207 /* This never affects the symbol's vcell */ 208 /* Non-null symbol in arg_y, new value in arg_z */ 209 210 _spentry(bind) 211 __(int $3) 212 _endsubp(bind) 213 214 /* arg_z = symbol: bind it to its current value */ 215 216 _spentry(bind_self) 217 __(int $3) 218 _endsubp(bind_self) 219 220 _spentry(bind_nil) 221 __(int $3) 222 _endsubp(bind_nil) 223 224 _spentry(bind_self_boundp_check) 225 __(int $3) 226 _endsubp(bind_self_boundp_check) 227 228 _spentry(conslist) 229 __(int $3) 230 _endsubp(conslist) 231 232 /* do list*: last arg in arg_z, all others pushed, nargs set to #args pushed. */ 233 /* Cons, one cons cell at at time. Maybe optimize this later. */ 234 235 _spentry(conslist_star) 236 __(int $3) 237 _endsubp(conslist_star) 238 239 /* We always have to create a tsp frame (even if nargs is 0), so the compiler */ 240 /* doesn't get confused. */ 241 _spentry(stkconslist) 242 __(int $3) 243 _endsubp(stkconslist) 244 245 /* do list*: last arg in arg_z, all others vpushed, */ 246 /* nargs set to #args vpushed. */ 247 248 _spentry(stkconslist_star) 249 __(int $3) 250 _endsubp(stkconslist_star) 251 252 253 /* Make a stack-consed simple-vector out of the NARGS objects */ 254 /* on top of the vstack; return it in arg_z. */ 255 256 _spentry(mkstackv) 257 __(int $3) 258 _endsubp(mkstackv) 259 260 .globl C(egc_write_barrier_start) 261 C(egc_write_barrier_start): 262 /* */ 263 /* The function pc_luser_xp() - which is used to ensure that suspended threads */ 264 /* are suspended in a GC-safe way - has to treat these subprims (which implement */ 265 /* the EGC write-barrier) specially. Specifically, a store that might introduce */ 266 /* an intergenerational reference (a young pointer stored in an old object) has */ 267 /* to "memoize" that reference by setting a bit in the global "refbits" bitmap. */ 268 /* This has to happen atomically, and has to happen atomically wrt GC. */ 269 270 /* Note that updating a word in a bitmap is itself not atomic, unless we use */ 271 /* interlocked loads and stores. */ 272 273 /* For RPLACA and RPLACD, things are fairly simple: regardless of where we are */ 274 /* in the function, we can do the store (even if it's already been done) and */ 275 /* calculate whether or not we need to set the bit out-of-line. (Actually */ 276 /* setting the bit needs to be done atomically, unless we're sure that other */ 277 /* threads are suspended.) */ 278 /* We can unconditionally set the suspended thread's RIP to the return address. */ 279 280 _spentry(rplaca) 281 .globl C(egc_rplaca) 282 C(egc_rplaca): 283 __(int $3) 284 _endsubp(rplaca) 285 286 _spentry(rplacd) 287 .globl C(egc_rplacd) 288 C(egc_rplacd): 289 __(int $3) 290 _endsubp(rplacd) 291 292 _spentry(gvset) 293 .globl C(egc_gvset) 294 C(egc_gvset): 295 __(int $3) 296 _endsubp(gvset) 297 298 _spentry(set_hash_key) 299 .globl C(egc_set_hash_key) 300 C(egc_set_hash_key): 301 __(int $3) 302 _endsubp(set_hash_key) 303 304 /* This is a little trickier: if this is interrupted, we need to know */ 305 /* whether or not the STORE-CONDITIONAL (cmpxchgq) has won or not. */ 306 /* If we're interrupted before the PC has reached the "success_test" label, */ 307 /* repeat (luser the PC back to .SPstore_node_conditional.) If we're at that */ 308 /* label with the Z flag set, we won and (may) need to memoize. */ 309 310 _spentry(store_node_conditional) 311 .globl C(egc_store_node_conditional) 312 C(egc_store_node_conditional): 313 .globl C(egc_store_node_conditional_success_test) 314 C(egc_store_node_conditional_success_test): 315 .globl C(egc_write_barrier_end) 316 C(egc_write_barrier_end): 317 __(int $3) 318 _endsubp(store_node_conditional) 319 320 _spentry(setqsym) 321 __(bt $sym_vbit_const,symbol.flags(%arg_y)) 322 __(jae _SPspecset) 323 __(mov %arg_y,%arg_z) 324 __(mov $XCONST,%arg_y) 325 __(set_nargs(2)) 357 326 __(jmp _SPksignalerr) 358 local_label(misc_ref_u32): 359 __(movl misc_data_offset(%arg_y,%arg_z),%imm0) 360 __(jmp _SPmakeu32) 361 __(ret) 362 local_label(misc_ref_node): 363 __(movl misc_data_offset(%arg_y,%arg_z),%arg_z) 364 __(ret) 365 local_label(misc_ref_single_float_vector): 366 local_label(misc_ref_s32): 367 local_label(misc_ref_fixnum_vector): 368 local_label(misc_ref_new_string): 369 local_label(misc_ref_u8): 370 local_label(misc_ref_s8): 327 _endsubp(setqsym) 328 329 _spentry(progvsave) 330 __(int $3) 331 _endsubp(progvsave) 332 333 /* Allocate node objects on the temp stack, immediate objects on the foreign */ 334 /* stack. (The caller has to know which stack to discard a frame from.) */ 335 /* %arg_y = boxed element-count, %arg_z = boxed subtype */ 336 337 _spentry(stack_misc_alloc) 338 __(int $3) 339 _endsubp(stack_misc_alloc) 340 341 /* subtype (boxed, of course) is pushed, followed by nargs bytes worth of */ 342 /* initial-contents. Note that this can be used to cons any type of initialized */ 343 /* node-header'ed misc object (symbols, closures, ...) as well as vector-like */ 344 /* objects. */ 345 _spentry(gvector) 346 __(int $3) 347 _endsubp(gvector) 348 349 _spentry(mvpass) 350 __(int $3) 351 _endsubp(mvpass) 352 353 _spentry(nthvalue) 354 __(int $3) 355 _endsubp(nthvalue) 356 357 _spentry(values) 358 __(int $3) 359 _endsubp(values) 360 361 _spentry(default_optional_args) 362 __(int $3) 363 _endsubp(default_optional_args) 364 365 _spentry(opt_supplied_p) 366 __(int $3) 367 _endsubp(opt_supplied_p) 368 369 _spentry(lexpr_entry) 370 __(int $3) 371 _endsubp(lexpr_entry) 372 373 _spentry(heap_rest_arg) 374 __(int $3) 375 _endsubp(heap_rest_arg) 376 377 /* %imm0 contains the number of fixed args ; make an &rest arg out of the others */ 378 _spentry(req_heap_rest_arg) 379 __(int $3) 380 _endsubp(req_heap_rest_arg) 381 382 /* %imm0 bytes of stuff has already been pushed */ 383 /* make an &rest arg out of any others */ 384 _spentry(heap_cons_rest_arg) 385 __(int $3) 386 _endsubp(heap_cons_rest_arg) 387 388 _spentry(simple_keywords) 389 __(xor %imm0,%imm0) 390 __(push_argregs()) 391 __(jmp _SPkeyword_bind) 392 _endsubp(simple_keywords) 393 394 _spentry(keyword_args) 395 __(push_argregs()) 396 __(jmp _SPkeyword_bind) 397 _endsubp(keyword_args) 398 399 /* There are %nargs words of arguments on the stack; %imm0 contains the number */ 400 /* of non-keyword args pushed. It's possible that we never actually got */ 401 /* any keyword args, which would make things much simpler. */ 402 403 /* On entry, temp1 contains a fixnum with bits indicating whether */ 404 /* &allow-other-keys and/or &rest was present in the lambda list. */ 405 /* Once we get here, we can use the arg registers. */ 406 407 define([keyword_flags_aok_bit],[fixnumshift]) 408 define([keyword_flags_unknown_keys_bit],[fixnumshift+1]) 409 define([keyword_flags_rest_bit],[fixnumshift+2]) 410 define([keyword_flags_seen_aok_bit],[fixnumshift+3]) 411 412 _spentry(keyword_bind) 413 __(int $3) 414 _endsubp(keyword_bind) 415 416 _spentry(ksignalerr) 417 __(mov $nrs.errdisp,%fname) 418 __(jump_fname) 419 _endsubp(ksignalerr) 420 421 _spentry(stack_rest_arg) 422 __(xorl %imm0,%imm0) 423 __(push_argregs()) 424 __(jmp _SPstack_cons_rest_arg) 425 _endsubp(stack_rest_arg) 426 427 _spentry(req_stack_rest_arg) 428 __(push_argregs()) 429 __(jmp _SPstack_cons_rest_arg) 430 _endsubp(req_stack_rest_arg) 431 432 _spentry(stack_cons_rest_arg) 433 _endsubp(stack_cons_rest_arg) 434 435 _spentry(getxlong) 436 __(int $3) 437 _endsubp(getxlong) 438 439 /* Have to be a little careful here: the caller may or may not have pushed */ 440 /* an empty frame, and we may or may not have needed one. We can't easily */ 441 /* tell whether or not a frame will be needed (if the caller didn't reserve */ 442 /* a frame, whether or not we need one depends on the length of the list */ 443 /* in arg_z. So, if the caller didn't push a frame, we do so ; once everything's */ 444 /* been spread, we discard the reserved frame (regardless of who pushed it) */ 445 /* if all args fit in registers. */ 446 _spentry(spreadargz) 447 __(int $3) 448 _endsubp(spreadargz) 449 450 451 /* Caller built it's own frame when it was entered. If all outgoing args */ 452 /* are in registers, we can discard that frame; otherwise, we copy outgoing */ 453 /* relative to it and restore %rbp/%ra0 */ 454 _spentry(tfuncallgen) 455 __(int $3) 456 _endsubp(tfuncallgen) 457 458 /* Some args were pushed; move them down in the frame */ 459 _spentry(tfuncallslide) 460 __(int $3) 461 _endsubp(tfuncallslide) 462 463 /* No args were pushed; recover saved context & do funcall */ 464 _spentry(tfuncallvsp) 465 __(leave) 466 __(do_funcall()) 467 _endsubp(tfuncallvsp) 468 469 _spentry(tcallsymgen) 470 __(int $3) 471 _endsubp(tcallsymgen) 472 473 _spentry(tcallsymslide) 474 __(int $3) 475 _endsubp(tcallsymslide) 476 477 _spentry(tcallsymvsp) 478 __(leave) 479 __(jump_fname()) 480 _endsubp(tcallsymvsp) 481 482 _spentry(tcallnfngen) 483 __(int $3) 484 _endsubp(tcallnfngen) 485 486 _spentry(tcallnfnslide) 487 __(int $3) 488 _endsubp(tcallnfnslide) 489 490 _spentry(tcallnfnvsp) 491 __(mov %temp0,%fn) 492 __(leave) 493 __(jmp *%fn) 494 _endsubp(tcallnfnvsp) 495 496 _spentry(makestackblock) 497 __(int $3) 498 _endsubp(makestackblock) 499 500 _spentry(makestackblock0) 501 __(int $3) 502 _endsubp(makestackblock0) 503 504 _spentry(makestacklist) 505 __(int $3) 506 _endsubp(makestacklist) 507 508 _spentry(stkgvector) 509 __(int $3) 510 _endsubp(stkgvector) 511 512 _spentry(misc_alloc) 513 __(int $3) 514 _endsubp(misc_alloc) 515 516 _startfn(C(destbind1)) 517 __(jmp *%ra0) 518 _endfn(C(destbind1)) 519 520 _spentry(macro_bind) 521 __(int $3) 522 _endsubp(macro_bind) 523 524 _spentry(destructuring_bind) 525 __(mov %arg_reg,%whole_reg) 526 __(jmp C(destbind1)) 527 _endsubp(destructuring_bind) 528 529 _spentry(destructuring_bind_inner) 530 __(mov %arg_z,%whole_reg) 531 __(jmp C(destbind1)) 532 _endsubp(destructuring_bind_inner) 533 534 _spentry(vpopargregs) 535 __(int $3) 536 _endsubp(vpopargregs) 537 538 /* If arg_z is an integer, return in imm0 something whose sign */ 539 /* is the same as arg_z's. If not an integer, error. */ 540 _spentry(integer_sign) 541 __(testb $tagmask,%arg_z_b) 542 __(mov %arg_z,%imm0) 543 __(je 8f) 544 __(extract_typecode(%arg_z,%imm0)) 545 __(cmpb $subtag_bignum,%imm0_b) 546 __(jne 9f) 547 __(getvheader(%arg_z,%imm0)) 548 __(shr $num_subtag_bits,%imm0) 549 __(movl misc_data_offset-4(%arg_z,%imm0,4),%imm0) 550 8: __(repret) 551 9: __(uuo_error_reg_not_type(Rarg_z,error_object_not_integer)) 552 _endsubp(integer_sign) 553 554 _spentry(mvslide) 555 __(int $3) 556 _endsubp(mvslide) 557 558 _spentry(save_values) 559 __(int $3) 560 _endsubp(save_values) 561 562 _spentry(add_values) 563 __(int $3) 564 _endsubp(add_values) 565 566 _spentry(recover_values) 567 __(int $3) 568 _endsubp(recover_values) 569 570 _spentry(recover_values_for_mvcall) 571 __(int $3) 572 _endsubp(recover_values_for_mvcall) 573 574 _spentry(reset) 575 __(int $3) 576 _endsubp(reset) 577 578 _spentry(misc_alloc_init) 579 __(int $3) 580 _endsubp(misc_alloc_init) 581 582 _spentry(stack_misc_alloc_init) 583 __(int $3) 584 _endsubp(stack_misc_alloc_init) 585 586 .globl C(popj) 587 _spentry(popj) 588 C(popj): 589 __(leave) 590 __(ret) 591 _endsubp(popj) 592 593 594 _spentry(gets64) 595 __(int $3) 596 _endsubp(gets64) 597 598 599 /* arg_z should be of type (unsigned-byte 64) */ 600 /* return unboxed value in mm0 */ 601 _spentry(getu64) 602 __(movl $~(target_most_positive_fixnum << fixnumshift),%imm0) 603 __(testl %arg_z,%imm0) 604 __(movl %arg_z,%imm0) 605 __(jne 1f) 606 __(sarl $fixnumshift,%imm0) 607 __(movd %imm0,%mm0) 608 __(ret) 609 1: __(andb $tagmask,%imm0_b) 610 __(cmpb $tag_misc,%imm0_b) 611 __(jne 9f) 612 __(movb misc_subtag_offset(%arg_z),%imm0_b) 613 __(cmpb $subtag_bignum,%imm0_b) 614 __(jne 9f) 615 __(movl misc_header_offset(%arg_z),%imm0) 616 __(cmpl $three_digit_bignum_header,%imm0) 617 __(je 3f) 618 __(cmpl $two_digit_bignum_header,%imm0) 619 __(jne 9f) 620 __(movl misc_data_offset(%arg_z),%imm0) 621 __(testl %imm0,%imm0) 622 __(js 9f) 623 __(repret) 624 3: __(movl misc_data_offset(%arg_z),%imm0) 625 __(cmpl $0,misc_data_offset+8(%arg_z)) 626 __(jne 9f) 627 __(repret) 628 9: __(uuo_error_reg_not_type(Rarg_z,error_object_not_u64)) 629 _endsubp(getu64) 630 631 _spentry(makeu64) 632 __(int $3) 633 _endsubp(makeu64) 634 635 _spentry(specref) 636 __(int $3) 637 _endsubp(specref) 638 639 _spentry(specset) 640 __(int $3) 641 _endsubp(specset) 642 643 _spentry(specrefcheck) 644 __(int $3) 645 _endsubp(specrefcheck) 646 647 _spentry(restoreintlevel) 648 __(int $3) 649 _endsubp(restoreintlevel) 650 651 _spentry(makeu32) 652 __(int $3) 653 _endsubp(makeu32) 654 655 _spentry(gets32) 656 __(int $3) 657 _endsubp(gets32) 658 659 _spentry(getu32) 660 __(int $3) 661 _endsubp(getu32) 662 663 _spentry(mvpasssym) 664 __(int $3) 665 _endsubp(mvpasssym) 666 667 _spentry(unbind) 668 __(int $3) 669 _endsubp(unbind) 670 671 _spentry(unbind_n) 672 __(int $3) 673 _endsubp(unbind_n) 674 675 _spentry(unbind_to) 676 __(int $3) 677 _endsubp(unbind_to) 678 679 _spentry(bind_interrupt_level_0) 680 __(int $3) 681 _endsubp(bind_interrupt_level_0) 682 683 _spentry(bind_interrupt_level_m1) 684 __(int $3) 685 _endsubp(bind_interrupt_level_m1) 686 687 _spentry(bind_interrupt_level) 688 __(int $3) 689 _endsubp(bind_interrupt_level) 690 691 _spentry(unbind_interrupt_level) 692 __(int $3) 693 _endsubp(unbind_interrupt_level) 694 695 _spentry(progvrestore) 696 __(int $3) 697 _endsubp(progvrestore) 698 699 _spentry(builtin_plus) 700 __(int $3) 701 _endsubp(builtin_plus) 702 703 _spentry(builtin_minus) 704 __(int $3) 705 _endsubp(builtin_minus) 706 707 _spentry(builtin_times) 708 __(int $3) 709 _endsubp(builtin_times) 710 711 _spentry(builtin_div) 712 __(jump_builtin(_builtin_div,2)) 371 713 372 714 /* %arg_z <- (= %arg_y %arg_z). */ … … 420 762 /* %arg_z <- (< %arg_y %arg_z). */ 421 763 _spentry(builtin_lt) 422 __(movl %arg_y,%imm0 _b)764 __(movl %arg_y,%imm0) 423 765 __(orb %arg_z_b,%imm0_b) 424 766 __(testb $fixnummask,%imm0_b) … … 442 784 _endsubp(builtin_le) 443 785 786 _spentry(builtin_eql) 787 __(int $3) 788 _endsubp(builtin_eql) 789 790 _spentry(builtin_length) 791 __(int $3) 792 _endsubp(builtin_length) 793 794 _spentry(builtin_seqtype) 795 __(int $3) 796 _endsubp(builtin_seqtype) 797 798 _spentry(builtin_assq) 799 __(int $3) 800 _endsubp(builtin_assq) 801 802 _spentry(builtin_memq) 803 __(int $3) 804 _endsubp(builtin_memq) 805 806 logbitp_max_bit = 30 807 808 _spentry(builtin_logbitp) 809 __(int $3) 810 _endsubp(builtin_logbitp) 811 444 812 _spentry(builtin_logior) 445 813 __(movl %arg_y,%imm0) … … 451 819 1: 452 820 __(jump_builtin(_builtin_logior,2)) 453 454 821 _endsubp(builtin_logior) 455 822 … … 485 852 __(jump_builtin(_builtin_logxor,2)) 486 853 _endsubp(builtin_logxor) 854 855 _spentry(builtin_aset1) 856 __(int $3) 857 _endsubp(builtin_aset1) 858 859 _spentry(builtin_ash) 860 __(int $3) 861 _endsubp(builtin_ash) 862 863 _spentry(builtin_aref1) 864 __(extract_typecode(%arg_y,%imm0)) 865 __(cmpb $min_vector_subtag,%imm0_b) 866 __(box_fixnum_no_flags(%imm0,%arg_y)) 867 __(ja _SPsubtag_misc_ref) 868 __(jump_builtin(_builtin_aref1,2)) 869 _endsubp(builtin_aref1) 870 871 _spentry(ffcall) 872 __(int $3) 873 _endsubp(ffcall) 874 875 _spentry(ffcall_return_registers) 876 __(int $3) 877 _endsubp(ffcall_return_registers) 878 879 _spentry(spread_lexprz) 880 __(int $3) 881 _endsubp(spread_lexprz) 882 883 _spentry(callback) 884 __(int $3) 885 _endsubp(callback) 886 887 _spentry(aref2) 888 __(int $3) 889 _endsubp(aref2) 890 891 _spentry(aref3) 892 __(int $3) 893 _endsubp(aref3) 894 895 _spentry(aset2) 896 __(int $3) 897 _endsubp(aset2) 898 899 _spentry(aset3) 900 __(int $3) 901 _endsubp(aset3) 902 903 _spentry(call_closure) 904 __(int $3) 905 _endsubp(call_closure) 906 907 _spentry(poweropen_callbackX) 908 __(int $3) 909 _endsubp(poweropen_callbackX) 910 911 _spentry(poweropen_ffcallX) 912 __(int $3) 913 _endsubp(poweropen_ffcallX) 914 915 _spentry(poweropen_syscall) 916 __(int $3) 917 _endsubp(poweropen_syscall) 918 919 _spentry(eabi_ff_call) 920 __(int $3) 921 _endsubp(eabi_ff_call) 922 923 _spentry(eabi_callback) 924 __(int $3) 925 _endsubp(eabi_callback) 926 927 928 /* Unused, and often not used on PPC either */ 929 _spentry(callbuiltin) 930 __(int $3) 931 _endsubp(callbuiltin) 932 933 _spentry(callbuiltin0) 934 __(int $3) 935 _endsubp(callbuiltin0) 936 937 _spentry(callbuiltin1) 938 __(int $3) 939 _endsubp(callbuiltin1) 940 941 _spentry(callbuiltin2) 942 __(int $3) 943 _endsubp(callbuiltin2) 944 945 _spentry(callbuiltin3) 946 __(int $3) 947 _endsubp(callbuiltin3) 948 949 _spentry(restorefullcontext) 950 __(int $3) 951 _endsubp(restorefullcontext) 952 953 _spentry(savecontextvsp) 954 __(int $3) 955 _endsubp(savecontextvsp) 956 957 _spentry(savecontext0) 958 __(int $3) 959 _endsubp(savecontext0) 960 961 _spentry(restorecontext) 962 __(int $3) 963 _endsubp(restorecontext) 964 965 _spentry(stkconsyz) 966 __(int $3) 967 _endsubp(stkconsyz) 968 969 _spentry(stkvcell0) 970 __(int $3) 971 _endsubp(stkvcell0) 972 973 _spentry(stkvcellvsp) 974 __(int $3) 975 _endsubp(stkvcellvsp) 976 977 _spentry(breakpoint) 978 __(int $3) 979 _endsubp(breakpoint) 980 981 _spentry(unused_5) 982 __(int $3) 983 _endsubp(unused_5) 984 985 _spentry(unused_6) 986 __(int $3) 987 _endsubp(unused_6) -
branches/ia32/lisp-kernel/x86-subprims32.s
r7286 r8068 1 1 include(lisp.s) 2 _beginfile 2 3 .globl _SPmkcatch1v 4 .globl _SPnthrow1value 5 6 /* This is called from a c-style context and calls a lisp function.*/ 7 /* This does the moral equivalent of*/ 8 /* (loop */ 9 /* (let* ((fn (%function_on_top_of_lisp_stack)))*/ 10 /* (if fn*/ 11 /* (catch %toplevel-catch%*/ 12 /* (funcall fn))*/ 13 /* (return nil))))*/ 14 15 16 _exportfn(toplevel_loop) 17 __(push %ebp) 18 __(movl %esp,%ebp) 19 /* Switch to the lisp stack */ 20 __(movl %esp,%rcontext:tcr.foreign_sp) 21 __(movl %rcontext:tcr.save_vsp,%esp) 22 __(push $0) 23 __(mov %esp,%ebp) 24 __(jmp local_label(test)) 25 local_label(loop): 26 __(ref_nrs_value(toplcatch,%arg_z)) 27 __(movl [$]local_label(back_from_catch),%ra0) 28 __(movl [$]local_label(test),%xfn) 29 __(push %ra0) 30 __(jmp _SPmkcatch1v) 31 __(tra(local_label(back_from_catch))) 32 __(movl %arg_y,%temp0) 33 __(pushl [$]local_label(back_from_funcall)) 34 __(set_nargs(0)) 35 __(jmp _SPfuncall) 36 __(tra(local_label(back_from_funcall))) 37 __(movl $fixnumone,%imm0) 38 __(movl [$]local_label(test),%ra0) 39 __(jmp _SPnthrow1value) 40 __(tra(local_label(test))) 41 __(movl 4(%ebp),%arg_y) 42 __(cmpl $nil_value,%arg_y) 43 __(jnz local_label(loop)) 44 local_label(back_to_c): 45 __(movl %rcontext:tcr.foreign_sp,%esp) 46 __(movl %esp,%ebp) 47 __(leave) 48 __(ret) 3 49 4 50 /* This is called from C code when a thread (including the initial thread) */ … … 43 89 __(ret) 44 90 _endfn 91 92
Note:
See TracChangeset
for help on using the changeset viewer.
