Changeset 8253


Ignore:
Timestamp:
Jan 24, 2008, 7:49:34 AM (12 years ago)
Author:
rme
Message:

Work in progress.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/ia32/lisp-kernel/x86-spentry32.s

    r8223 r8253  
    4242_endsubp(misc_ref)
    4343
     44/* %imm0 = subtag, %arg_y = uvector, %arg_z = index. */
     45/* Bounds/type-checking done in caller. */
    4446_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
     51local_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
     328local_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))
     333local_label(misc_ref_node):
     334        __(movl misc_data_offset(%arg_y,%arg_z),%arg_z)
     335        __(ret)
     336local_label(misc_ref_u32):
     337        __(movl misc_data_offset(%arg_y,%arg_z),%imm0)
     338        __(jmp _SPmakeu32)
     339local_label(misc_ref_s32):
     340        __(movl misc_data_offset(%arg_y,%arg_z),%imm0)
     341        __(jmp _SPmakes32)
     342local_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)
     349local_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)
     356local_label(misc_ref_fixnum_vector):
     357        __(movl misc_data_offset(%arg_y,%arg_z),%imm0)
     358        __(box_fixnum(%imm0,%arg_z))
     359        __(ret)
     360local_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)
     366local_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)
     372local_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)
     378local_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)
     384local_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)
     390local_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)
     397local_label(misc_ref_invalid):
     398        __(push $XBADVEC)
     399        __(set_nargs(3))
     400        __(jmp _SPksignalerr)
    46401_endfn(C(misc_ref_common))
    47402
     403/* Like misc_ref, only the boxed subtag is in temp0. */
    48404_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))
     4100:      __(testb $fixnummask,%arg_z_b)
     411        __(je,pt 1f)
     412        __(uuo_error_reg_not_fixnum(Rarg_z))
     4131:      __(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))
     4192:      __(unbox_fixnum(%temp0,%imm0))
     420        __(jmp C(misc_ref_common))
    50421_endsubp(subtag_misc_ref)
    51422
     
    92463
    93464/* 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 */
    95465_spentry(makes32)
     466        __(imull $fixnumone,%imm0,%arg_z)       /* result is fixnum-tagged */
     467        __(jno 0f)                              /* but may have overflowed */
    96468        __(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 */
    106469        __(movl $one_digit_bignum_header,%imm0)
    107470        __(movd %imm0,%mm0)
     
    182545/*   double binding of *interrupt-level* out-of-line */
    183546_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)
    185559_endsubp(nmkunwind)
    186560
     
    291665_endsubp(rplacd)
    292666
     667/* Storing into a gvector can be handles the same way as storing into a CONS. */
    293668/* args (src, unscaled-idx, val) in temp0, arg_y, arg_z */
    294669_spentry(gvset)
    295670        .globl C(egc_gvset)
    296671C(egc_gvset):
    297         __(int $3)
     672        __(movl %arg_z,misc_data_offset(%temp0,%arg_y))
     673        __(rcmpl(%arg_z,%temp0))
     674        __(ja 1f)
     6750:      __(repret)
     6761:      __(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)
    298689_endsubp(gvset)
    299690
     
    440831
    441832/* 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.   */
    448839_spentry(spreadargz)
    449840        __(int $3)
     
    541932/* is the same as arg_z's.  If not an integer, error.   */
    542933_spentry(integer_sign)
     934        __(mov %arg_z,%imm0)
    543935        __(testb $tagmask,%arg_z_b)
    544         __(mov %arg_z,%imm0)
    545936        __(je 8f)
    546937        __(extract_typecode(%arg_z,%imm0))
     
    6561047       
    6571048_spentry(specrefcheck)
     1049        __(movl %rcontext:tcr.tlb_pointer,%temp1)
     1050        __(mov %arg_z,%arg_y)
    6581051        __(movl symbol.binding_index(%arg_z),%imm0)
    6591052        __(cmp %rcontext:tcr.tlb_limit,%imm0)
    660         __(movl %rcontext:tcr.tlb_pointer,%temp1)
    661         __(mov %arg_z,%arg_y)
    6621053        __(jae 7f)
    6631054        __(movl (%temp1,%imm0),%arg_z)
     
    7041095
    7051096_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)
     11050:      __(jmp *%ra0)
     1106        /* Interrupt level was negative; interrupt may be pending */
     11071:      __(check_pending_enabled_interrupt(2f))
     11082:      __(jmp *%ra0)
    7071109_endsubp(bind_interrupt_level_0)
    7081110
     
    7111113_endsubp(bind_interrupt_level_m1)
    7121114
     1115/* Bind CCL::*INTERRUPT-LEVEL* to the value in arg_z.  If that value's 0, */
     1116/* do what _SPbind_interrupt_level_0 does. */
    7131117_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)
    7151127_endsubp(bind_interrupt_level)
    7161128
     
    7231135_endsubp(progvrestore)
    7241136
     1137/* %arg_z <- %arg_y + %arg_z.  Do the fixnum case - including overflow -  */
     1138/* inline.  Call out otherwise.   */
    7251139_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)
     11471:      __(jump_builtin(_builtin_plus,2))
    7271148_endsubp(builtin_plus)
    7281149
     
    8151236
    8161237_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)
     12521:      /* vector header */
     1253        __(movl vectorH.logsize(%arg_z),%arg_z)
     1254        __(ret)
     12552:      /* 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 */
     12593:      __(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)
     12768:
     1277        __(jump_builtin(_builtin_length,1))
     12789:
     1279        __(movl %arg_y,%arg_z)
     1280        __(ret)
    8181281_endsubp(builtin_length)
    8191282
     
    8891352_spentry(builtin_aref1)
    8901353        __(extract_typecode(%arg_y,%imm0))
     1354        __(box_fixnum_no_flags(%imm0,%temp0))
    8911355        __(cmpb $min_vector_subtag,%imm0_b)
    892         __(box_fixnum_no_flags(%imm0,%arg_y))
    8931356        __(ja _SPsubtag_misc_ref)
    8941357        __(jump_builtin(_builtin_aref1,2))
Note: See TracChangeset for help on using the changeset viewer.