Changeset 6316


Ignore:
Timestamp:
Apr 20, 2007, 9:02:56 AM (15 years ago)
Author:
gb
Message:

Add variants of many subprims which take their return addresses on
the stack (via :talign/call), rather than in ra0.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/x8664-call/ccl/lisp-kernel/x86-spentry64.s

    r6253 r6316  
    3737        jump_fname()
    3838])
     39
     40define([pop_jump_builtin],[
     41        pop %ra0
     42        jump_builtin($1,$2)
     43])               
     44       
    3945
    4046_spentry(bad_funcall)   
     
    5864_endsubp(fix_overflow)
    5965
    60        
     66
     67_spentry(nfix_overflow)       
     68C(nfix_one_bit_overflow):       
     69        __(movq $two_digit_bignum_header,%imm0)
     70        __(Misc_Alloc_Fixed([],aligned_bignum_size(2)))
     71        __(unbox_fixnum(%arg_z,%imm0))
     72        __(movq $0xe000000000000000,%imm1)
     73        __(mov %temp0,%arg_z)
     74        __(xorq %imm1,%imm0)
     75        __(movq %imm0,misc_data_offset(%arg_z))
     76        __(ret)
     77_endsubp(nfix_overflow)
     78               
    6179/* Make a lisp integer (fixnum or two-digit bignum) from the signed  */
    6280/* 64-bit value in %imm0.   */
     
    75930:      __(jmp *%ra0)
    7694_endsubp(makes64)       
    77                                
     95
     96_spentry(nmakes64)
     97        __(movq %imm0,%imm1)
     98        __(shlq $fixnumshift,%imm1)
     99        __(movq %imm1,%arg_z)
     100        __(sarq $fixnumshift,%imm1)
     101        __(cmpq %imm1,%imm0)
     102        __(jz,pt 0f)
     103        __(movd %imm0,%mm0)
     104        __(movq $two_digit_bignum_header,%imm0)
     105        __(Misc_Alloc_Fixed(%arg_z,aligned_bignum_size(2)))
     106        __(movq %mm0,misc_data_offset(%arg_z))
     1070:      __(ret)
     108_endsubp(nmakes64)     
     109                                       
    78110
    79111/* %imm1:%imm0 constitute a signed integer, almost certainly a bignum.  */
     
    119151_endfn
    120152
     153/* %imm1:%imm0 constitute a signed integer, almost certainly a bignum.  */
     154/* Make a lisp integer out of those 128 bits ..   */
     155       
     156_startfn(C(nmakes128))
     157       
     158        /*  We're likely to have to make a bignum out of the integer in %imm1 and  */
     159        /*  %imm0. We'll need to use %imm0 and %imm1 to cons the bignum, and  */
     160        /*  will need to do some arithmetic (determining significant bigits)  */
     161        /*  on %imm0 and %imm1 in order to know how large that bignum needs to be.  */
     162        /*  Cache %imm0 and %imm1 in %mm0 and %mm1.   */
     163   
     164        __(movd %imm0,%mm0)
     165        __(movd %imm1,%mm1)
     166       
     167        /* If %imm1 is just a sign extension of %imm0, make a 64-bit signed integer.   */
     168       
     169        __(sarq $63,%imm0)
     170        __(cmpq %imm0,%imm1)
     171        __(movd %mm0,%imm0)
     172        __(je _SPnmakes64)
     173       
     174        /* Otherwise, if the high 32 bits of %imm1 are a sign-extension of the  */
     175        /* low 32 bits of %imm1, make a 3-digit bignum.  If the upper 32 bits  */
     176        /* of %imm1 are significant, make a 4 digit bignum   */
     177       
     178        __(movq %imm1,%imm0)
     179        __(shlq $32,%imm0)
     180        __(sarq $32,%imm0)
     181        __(cmpq %imm0,%imm1)
     182        __(jz 3f)
     183        __(mov $four_digit_bignum_header,%imm0)
     184        __(Misc_Alloc_Fixed(%arg_z,aligned_bignum_size(4)))
     185        __(movq %mm0,misc_data_offset(%arg_z))
     186        __(movq %mm1,misc_data_offset+8(%arg_z))
     187        __(ret)
     1883:      __(mov $three_digit_bignum_header,%imm0)
     189        __(Misc_Alloc_Fixed(%arg_z,aligned_bignum_size(3)))
     190        __(movq %mm0,misc_data_offset(%arg_z))
     191        __(movd %mm1,misc_data_offset+8(%arg_z))
     192        __(ret)
     193_endfn
     194       
    121195/* %imm1:%imm0 constitute an unsigned integer, almost certainly a bignum.  */
    122196/* Make a lisp integer out of those 128 bits ..  */
     
    46044678        __(jmp 8b)
    46054679_endsubp(aset3)
     4680
    46064681       
     4682/* %arg_z <- %arg_y + %arg_z.  Do the fixnum case - including overflow -  */
     4683/* inline.  Call out otherwise.   */
     4684_spentry(nbuiltin_plus)
     4685        __(movb %arg_z_b,%imm0_b)
     4686        __(orb %arg_y_b,%imm0_b)
     4687        __(testb $fixnummask,%imm0_b)
     4688        __(jne 1f)
     4689        __(addq %arg_y,%arg_z)
     4690        __(jo,pn C(nfix_one_bit_overflow))
     4691        __(ret)
     46921:      __(pop_jump_builtin(_builtin_plus,2))
     4693_endsubp(nbuiltin_plus)
     4694       
     4695
     4696/* %arg_z <- %arg_z - %arg_y.  Do the fixnum case - including overflow -  */
     4697/*  inline.  Call out otherwise.   */
     4698_spentry(nbuiltin_minus)                       
     4699        __(movb %arg_z_b,%imm0_b)
     4700        __(orb %arg_y_b,%imm0_b)
     4701        __(testb $fixnummask,%imm0_b)
     4702        __(jne 1f)
     4703        __(xchgq %arg_y,%arg_z)
     4704        __(subq %arg_y,%arg_z)
     4705        __(jo,pn C(nfix_one_bit_overflow))
     4706        __(ret)
     47071:      __(pop_jump_builtin(_builtin_minus,2))
     4708_endsubp(nbuiltin_minus)
     4709
     4710/* %arg_z <- %arg_z * %arg_y.  Do the fixnum case - including overflow -  */
     4711/* inline.  Call out otherwise.   */
     4712_spentry(nbuiltin_times)
     4713        __(movb %arg_z_b,%imm0_b)
     4714        __(orb %arg_y_b,%imm0_b)
     4715        __(testb $fixnummask,%imm0_b)
     4716        __(jne 2f)
     4717        __(unbox_fixnum(%arg_z,%imm0))
     4718        /* 128-bit fixnum result in %imm1:%imm0. Overflow set if %imm1  */
     4719        /* is significant   */
     4720        __(imul %arg_y)
     4721        __(jo 1f)
     4722        __(mov %imm0,%arg_z)
     4723        __(ret)
     47241:      __(unbox_fixnum(%arg_z,%imm0))
     4725        __(unbox_fixnum(%arg_y,%imm1))
     4726        __(imul %imm1)
     4727        __(jmp C(nmakes128))
     47282:      __(pop_jump_builtin(_builtin_times,2))
     4729_endsubp(nbuiltin_times)
     4730
     4731_spentry(nbuiltin_div)
     4732        __(pop_jump_builtin(_builtin_div,2))
     4733
     4734/* %arg_z <- (= %arg_y %arg_z).   */
     4735_spentry(nbuiltin_eq)
     4736        __(movb %arg_z_b,%imm0_b)
     4737        __(orb %arg_y_b,%imm0_b)
     4738        __(testb $fixnummask,%imm0_b)
     4739        __(jne 1f)
     4740        __(rcmpq(%arg_z,%arg_y))
     4741        __(condition_to_boolean(e,%imm0,%arg_z))
     4742        __(ret)
     47431:      __(pop_jump_builtin(_builtin_eq,2))
     4744_endsubp(nbuiltin_eq)
     4745       
     4746/* %arg_z <- (/= %arg_y %arg_z).          */
     4747_spentry(nbuiltin_ne)
     4748        __(movb %arg_z_b,%imm0_b)
     4749        __(orb %arg_y_b,%imm0_b)
     4750        __(testb $fixnummask,%imm0_b)
     4751        __(jne 1f)
     4752        __(rcmpq(%arg_z,%arg_y))
     4753        __(condition_to_boolean(ne,%imm0,%arg_z))
     4754        __(ret)
     47551:      __(pop_jump_builtin(_builtin_ne,2))
     4756_endsubp(nbuiltin_ne)
     4757       
     4758/* %arg_z <- (> %arg_y %arg_z).   */
     4759_spentry(nbuiltin_gt)
     4760        __(movb %arg_z_b,%imm0_b)
     4761        __(orb %arg_y_b,%imm0_b)
     4762        __(testb $fixnummask,%imm0_b)
     4763        __(jne 1f)
     4764        __(rcmpq(%arg_y,%arg_z))
     4765        __(condition_to_boolean(g,%imm0,%arg_z))
     4766        __(ret)
     47671:      __(pop_jump_builtin(_builtin_gt,2))
     4768_endsubp(nbuiltin_gt)
     4769
     4770/* %arg_z <- (>= %arg_y %arg_z).          */
     4771_spentry(nbuiltin_ge)
     4772        __(movb %arg_z_b,%imm0_b)
     4773        __(orb %arg_y_b,%imm0_b)
     4774        __(testb $fixnummask,%imm0_b)
     4775        __(jne 1f)
     4776        __(rcmpq(%arg_y,%arg_z))
     4777        __(condition_to_boolean(ge,%imm0,%arg_z))
     4778        __(ret)
     47791:      __(pop_jump_builtin(_builtin_ge,2))
     4780_endsubp(nbuiltin_ge)
     4781       
     4782/* %arg_z <- (< %arg_y %arg_z).   */
     4783_spentry(nbuiltin_lt)
     4784        __(movb %arg_z_b,%imm0_b)
     4785        __(orb %arg_y_b,%imm0_b)
     4786        __(testb $fixnummask,%imm0_b)
     4787        __(jne 1f)
     4788        __(rcmpq(%arg_y,%arg_z))
     4789        __(condition_to_boolean(l,%imm0,%arg_z))
     4790        __(ret)
     47911:      __(pop_jump_builtin(_builtin_lt,2))
     4792_endsubp(nbuiltin_lt)
     4793
     4794/* %arg_z <- (<= %arg_y %arg_z).   */
     4795_spentry(nbuiltin_le)
     4796        __(movb %arg_z_b,%imm0_b)
     4797        __(orb %arg_y_b,%imm0_b)
     4798        __(testb $fixnummask,%imm0_b)
     4799        __(jne 1f)
     4800        __(rcmpq(%arg_y,%arg_z))
     4801        __(condition_to_boolean(le,%imm0,%arg_z))
     4802        __(ret)
     48031:      __(pop_jump_builtin(_builtin_le,2))
     4804_endsubp(nbuiltin_le)
     4805
     4806_spentry(nbuiltin_eql)
     4807        __(cmpq %arg_y,%arg_z)
     4808        __(je 1f)
     4809        /* Not EQ.  Could only possibly be EQL if both are tag-misc  */
     4810        /* and both have the same subtag   */
     4811        __(extract_lisptag(%arg_y,%imm0))
     4812        __(extract_lisptag(%arg_z,%imm1))
     4813        __(cmpb $tag_misc,%imm0_b)
     4814        __(jne 2f)
     4815        __(cmpb %imm0_b,%imm1_b)
     4816        __(jne 2f)
     4817        __(extract_subtag(%arg_y,%imm0_b))
     4818        __(extract_subtag(%arg_z,%imm1_b))
     4819        __(cmpb %imm0_b,%imm1_b)
     4820        __(jne 2f)
     4821        __(pop_jump_builtin(_builtin_eql,2))
     48221:      __(movl $t_value,%arg_z_l)
     4823        __(ret)
     48242:      __(movl $nil_value,%arg_z_l)
     4825        __(ret)
     4826_endsubp(nbuiltin_eql)
     4827
     4828_spentry(nbuiltin_length)
     4829        __(extract_lisptag(%arg_z,%imm0))
     4830        __(cmpb $tag_list,%imm0_b)
     4831        __(jz 2f)
     4832        __(cmpb $tag_misc,%imm0_b)
     4833        __(jnz 8f)
     4834        __(extract_subtag(%arg_z,%imm0_b))
     4835        __(rcmpb(%imm0_b,$min_vector_subtag))
     4836        __(jb 8f)
     4837        __(je 1f)
     4838        /* (simple-array * (*))   */
     4839        __(movq %arg_z,%arg_y)
     4840        __(vector_length(%arg_y,%arg_z))
     4841        __(ret)
     48421:      /* vector header   */
     4843        __(movq vectorH.logsize(%arg_z),%arg_z)
     4844        __(ret)
     48452:      /* list.  Maybe null, maybe dotted or circular.   */
     4846        __(movq $-fixnumone,%temp2)
     4847        __(movq %arg_z,%temp0)  /* fast pointer   */
     4848        __(movq %arg_z,%temp1)  /* slow pointer   */
     48493:      __(extract_lisptag(%temp0,%imm0))       
     4850        __(compare_reg_to_nil(%temp0))
     4851        __(leaq fixnumone(%temp2),%temp2)
     4852        __(je 9f)
     4853        __(cmpb $tag_list,%imm0_b)
     4854        __(jne 8f)
     4855        __(extract_lisptag(%temp1,%imm1))
     4856        __(testb $fixnumone,%temp2_b)
     4857        __(_cdr(%temp0,%temp0))
     4858        __(je 3b)
     4859        __(cmpb $tag_list,%imm1_b)
     4860        __(jne 8f)
     4861        __(_cdr(%temp1,%temp1))
     4862        __(cmpq %temp0,%temp1)
     4863        __(jne 3b)
     48648:     
     4865        __(pop_jump_builtin(_builtin_length,1))
     48669:     
     4867        __(movq %temp2,%arg_z)
     4868        __(ret)         
     4869_endsubp(nbuiltin_length)
     4870
     4871       
     4872_spentry(nbuiltin_seqtype)
     4873        __(extract_lisptag(%arg_z,%imm0))
     4874        __(cmpb $tag_list,%imm0_b)
     4875        __(jz 1f)
     4876        __(cmpb $tag_misc,%imm0_b)
     4877        __(jne 2f)
     4878        __(movb misc_subtag_offset(%arg_z),%imm0_b)
     4879        __(rcmpb(%imm0_b,$min_vector_subtag))
     4880        __(jb 2f)
     4881        __(movl $nil_value,%arg_z_l)
     4882        __(ret)
     48831:      __(movl $t_value,%arg_z_l)
     4884        __(ret)
     48852:     
     4886        __(pop_jump_builtin(_builtin_seqtype,1))
     4887_endsubp(nbuiltin_seqtype)
     4888
     4889_spentry(nbuiltin_assq)
     4890        __(cmpb $fulltag_nil,%arg_z_b)
     4891        __(jz 5f)
     48921:      __(movb $tagmask,%imm0_b)
     4893        __(andb %arg_z_b,%imm0_b)
     4894        __(cmpb $tag_list,%imm0_b)
     4895        __(jz,pt 2f)
     4896        __(uuo_error_reg_not_list(Rarg_z))
     48972:      __(_car(%arg_z,%arg_x))
     4898        __(_cdr(%arg_z,%arg_z))
     4899        __(cmpb $fulltag_nil,%arg_x_b)
     4900        __(jz 4f)
     4901        __(movb $tagmask,%imm0_b)
     4902        __(andb %arg_x_b,%imm0_b)
     4903        __(cmpb $tag_list,%imm0_b)
     4904        __(jz,pt 3f)
     4905        __(uuo_error_reg_not_list(Rarg_x))
     49063:      __(_car(%arg_x,%temp0))
     4907        __(cmpq %temp0,%arg_y)
     4908        __(jnz 4f)
     4909        __(movq %arg_x,%arg_z)
     4910        __(ret)
     49114:      __(cmpb $fulltag_nil,%arg_z_b)
     49125:      __(jnz 1b)
     4913        __(ret)                 
     4914_endsubp(nbuiltin_assq)
     4915
     4916_spentry(nbuiltin_memq)
     4917        __(cmpb $fulltag_nil,%arg_z_b)
     4918        __(jmp 3f)
     49191:      __(movb $tagmask,%imm0_b)
     4920        __(andb %arg_z_b,%imm0_b)
     4921        __(cmpb $tag_list,%imm0_b)
     4922        __(jz,pt 2f)
     4923        __(uuo_error_reg_not_list(Rarg_z))
     49242:      __(_car(%arg_z,%arg_x))
     4925        __(_cdr(%arg_z,%temp0))
     4926        __(cmpq %arg_x,%arg_y)
     4927        __(jz 4f)
     4928        __(cmpb $fulltag_nil,%temp0_b)
     4929        __(movq %temp0,%arg_z)
     49303:      __(jnz 1b)
     49314:      __(ret)                         
     4932_endsubp(nbuiltin_memq)
     4933
     4934       
     4935_spentry(nbuiltin_logbitp)
     4936        __(movb %arg_z_b,%imm0_b)
     4937        __(orb %arg_y_b,%imm0_b)
     4938        __(testb $fixnummask,%imm0_b)
     4939        __(jnz 1f)
     4940        __(unbox_fixnum(%arg_y,%imm0))
     4941        __(movl $logbitp_max_bit-1+fixnumshift,%imm1_l)
     4942        __(js 1f)               /* bit number negative */
     4943        __(addb $fixnumshift,%imm0_b)
     4944        __(cmpq $logbitp_max_bit<<fixnumshift,%arg_y)
     4945        __(cmovael %imm1_l,%imm0_l)
     4946        __(bt %imm0,%arg_z)
     4947        __(condition_to_boolean(b,%imm0,%arg_z))
     4948        __(ret)
     49491:      __(pop_jump_builtin(_builtin_logbitp,2))
     4950_endsubp(nbuiltin_logbitp)
     4951
     4952_spentry(nbuiltin_logior)
     4953        __(movb %arg_y_b,%imm0_b)
     4954        __(orb %arg_z_b,%imm0_b)
     4955        __(testb $fixnummask,%imm0_b)
     4956        __(jne 1f)
     4957        __(orq %arg_y,%arg_z)
     4958        __(ret)
     49591:     
     4960        __(pop_jump_builtin(_builtin_logior,2))
     4961               
     4962_endsubp(nbuiltin_logior)
     4963
     4964_spentry(nbuiltin_logand)
     4965        __(movb %arg_y_b,%imm0_b)
     4966        __(orb %arg_z_b,%imm0_b)
     4967        __(testb $fixnummask,%imm0_b)
     4968        __(jne 1f)
     4969        __(andq %arg_y,%arg_z)
     4970        __(ret)
     49711:             
     4972        __(pop_jump_builtin(_builtin_logand,2))
     4973_endsubp(nbuiltin_logand)
     4974
     4975_spentry(nbuiltin_negate)
     4976        __(testb $fixnummask,%arg_z_b)
     4977        __(jne 1f)
     4978        __(negq %arg_z)
     4979        __(jo,pn C(nfix_one_bit_overflow))
     4980        __(ret)
     49811:             
     4982        __(pop_jump_builtin(_builtin_negate,1))
     4983_endsubp(nbuiltin_negate)
     4984
     4985_spentry(nbuiltin_logxor)
     4986        __(movb %arg_y_b,%imm0_b)
     4987        __(orb %arg_z_b,%imm0_b)
     4988        __(testb $fixnummask,%imm0_b)
     4989        __(jne 1f)
     4990        __(xorq %arg_y,%arg_z)
     4991        __(ret)
     49921:             
     4993        __(pop_jump_builtin(_builtin_logxor,2))
     4994_endsubp(nbuiltin_logxor)
     4995
     4996
     4997_spentry(nbuiltin_aset1)
     4998        __(pop %ra0)            /* for now */
     4999        __(extract_typecode(%arg_x,%imm0))
     5000        __(box_fixnum(%imm0,%temp0))
     5001        __(cmpb $min_vector_subtag,%imm0_b)
     5002        __(ja _SPsubtag_misc_set)
     5003        __(jump_builtin(_builtin_aset1,3))
     5004_endsubp(nbuiltin_aset1)
     5005
     5006/* We have to be a little careful here  %cl has to be used for  */
     5007/*   the (unboxed) shift count in all variable-length shifts, and  */
     5008/*   %temp2 = %rcx.  Zero all but the low 8 (or 6) bits of %rcx,  */
     5009/*   so that the shift count doesn't confuse the GC.  */
     5010
     5011_spentry(nbuiltin_ash)
     5012        __(movb %arg_y_b,%imm0_b)
     5013        __(orb %arg_z_b,%imm0_b)
     5014        __(testb $fixnummask,%imm0_b)
     5015        __(jne 9f)
     5016        __(unbox_fixnum(%arg_y,%imm1))
     5017        __(unbox_fixnum(%arg_z,%imm0))
     5018        /* Z flag set if zero ASH shift count   */
     5019        __(jnz 1f)
     5020        __(movq %arg_y,%arg_z)  /* shift by 0   */
     5021        __(jmp *%ra0)
     50221:      __(jns 3f)
     5023        __(rcmpq(%imm0,$-63))
     5024        __(jg 2f)
     5025        __(sar $63,%imm1)
     5026        __(box_fixnum(%imm1,%arg_z))
     5027        __(ret)
     50282:      /* Right-shift by small fixnum   */
     5029        __(negb %imm0_b)
     5030        __(movzbl %imm0_b,%ecx)
     5031        __(sar %cl,%imm1)
     5032        __(xorl %ecx,%ecx)
     5033        __(box_fixnum(%imm1,%arg_z))
     5034        __(ret)
     50353:      /* Left shift by fixnum. We cant shift by more than 63 bits, though  */
     5036        /* shifting by 64 is actually easy.   */
     5037        __(rcmpq(%imm0,$64))
     5038        __(jg 9f)
     5039        __(jne 4f)
     5040        /* left-shift by 64-bits exactly   */
     5041        __(xorl %imm0_l,%imm0_l)
     5042        __(jmp C(nmakes128))
     50434:      /* left-shift by 1..63 bits.  Safe to move shift count to %rcx/%cl   */
     5044        __(movzbl %imm0_b,%ecx)  /* zero-extending mov   */
     5045        __(movq %imm1,%imm0)
     5046        __(sarq $63,%imm1)
     5047        __(js 5f)
     5048        __(shld %cl,%imm0,%imm1)
     5049        __(shl %cl,%imm0)
     5050        __(xorb %cl,%cl)
     5051        __(jmp C(nmakes128))
     50525:      __(shld %cl,%imm0,%imm1)
     5053        __(shl %cl,%imm0)
     5054        __(xorb %cl,%cl)
     5055        __(jmp C(nmakes128))
     50569:     
     5057        __(pop_jump_builtin(_builtin_ash,2))
     5058_endsubp(nbuiltin_ash)
     5059
     5060_spentry(nbuiltin_aref1)
     5061        __(pop %ra0)            /* for now */
     5062        __(extract_typecode(%arg_y,%imm0))
     5063        __(cmpb $min_vector_subtag,%imm0_b)
     5064        __(box_fixnum_no_flags(%imm0,%arg_x))
     5065        __(ja _SPsubtag_misc_ref)
     5066        __(jump_builtin(_builtin_aref1,2))
     5067_endsubp(nbuiltin_aref1)
     5068
     5069
     5070_spentry(nmakeu64)
     5071        __(movq %imm0,%imm1)
     5072        __(shlq $fixnumshift+1,%imm1)
     5073        __(movq %imm1,%arg_z)   /* Tagged as a fixnum, 2x    */
     5074        __(shrq $fixnumshift+1,%imm1)
     5075        __(shrq %arg_z)
     5076        __(cmpq %imm0,%imm1)
     5077        __(je 9f)
     5078        __(testq %imm0,%imm0)
     5079        __(movd %imm0,%mm0)
     5080        __(js 3f)
     5081        /* Make a 2-digit bignum.   */
     5082        __(movl $two_digit_bignum_header,%imm0_l)
     5083        __(movl $aligned_bignum_size(2),%imm1_l)
     5084        __(Misc_Alloc(%arg_z))
     5085        __(movq %mm0,misc_data_offset(%arg_z))
     5086        __(jmp *%ra0)
     50873:      __(movl $three_digit_bignum_header,%imm0_l)
     5088        __(movl $aligned_bignum_size(3),%imm1_l)
     5089        __(Misc_Alloc(%arg_z))
     5090        __(movq %mm0,misc_data_offset(%arg_z))
     50919:      __(ret)
     5092_endsubp(nmakeu64)
     5093
     5094/* on entry: arg_z = symbol.  On exit, arg_z = value (possibly  */
     5095/* unbound_marker), arg_y = symbol   */
     5096_spentry(nspecref)
     5097        __(movq symbol.binding_index(%arg_z),%imm0)
     5098        __(cmp %rcontext:tcr.tlb_limit,%imm0)
     5099        __(movq %rcontext:tcr.tlb_pointer,%imm1)
     5100        __(movq %arg_z,%arg_y)
     5101        __(jae 7f)
     5102        __(movq (%imm1,%imm0),%arg_z)
     5103        __(cmpb $no_thread_local_binding_marker,%arg_z_b)
     5104        __(jne 8f)
     51057:      __(movq symbol.vcell(%arg_y),%arg_z)
     51068:      __(ret)         
     5107_endsubp(nspecref)
     5108
     5109/* arg_y = special symbol, arg_z = new value.           */
     5110_spentry(nspecset)
     5111        __(movq symbol.binding_index(%arg_y),%imm0)
     5112        __(cmp %rcontext:tcr.tlb_limit,%imm0)
     5113        __(movq %rcontext:tcr.tlb_pointer,%imm1)
     5114        __(jae 1f)
     5115        __(movq (%imm1,%imm0),%arg_x)
     5116        __(cmpb $no_thread_local_binding_marker,%arg_x_b)
     5117        __(je 1f)
     5118        __(movq %arg_z,(%imm1,%imm0))
     5119        __(ret)
     51201:      __(lea fulltag_misc-fulltag_symbol(%arg_y),%arg_x)
     5121        __(movq $1<<fixnumshift,%arg_y)
     5122        __(pop %ra0)
     5123        __(jmp _SPgvset)
     5124_endsubp(nspecset)
     5125
     5126_spentry(nspecrefcheck)
     5127        __(movq symbol.binding_index(%arg_z),%imm0)
     5128        __(cmp %rcontext:tcr.tlb_limit,%imm0)
     5129        __(movq %rcontext:tcr.tlb_pointer,%imm1)
     5130        __(movq %arg_z,%arg_y)
     5131        __(jae 7f)
     5132        __(movq (%imm1,%imm0),%arg_z)
     5133        __(cmpb $no_thread_local_binding_marker,%arg_z_b)
     5134        __(jne 8f)
     51357:      __(movq symbol.vcell(%arg_y),%arg_z)
     51368:      __(cmpb $unbound_marker,%arg_z_b)
     5137        __(jne,pt 9f)
     5138        __(uuo_error_reg_unbound(Rarg_y))
     51399:      __(ret)         
     5140_endsubp(nspecrefcheck)
     5141                               
    46075142       
    46085143_spentry(poweropen_callbackX)
Note: See TracChangeset for help on using the changeset viewer.