Changeset 9690


Ignore:
Timestamp:
Jun 7, 2008, 4:44:08 AM (11 years ago)
Author:
rme
Message:

Implement .SPmacro_bind, destbind1.

File:
1 edited

Legend:

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

    r9683 r9690  
    27762776/* %arg_reg is %temp1, key vector in %arg_y */
    27772777_startfn(C(destbind1))
    2778         __(uuo_error_debug_trap)
    2779 dnl     /* Save entry %esp in case of error   */
    2780 dnl     __(movd %esp,%mm0)
    2781 dnl     /* Save arg count word */
    2782 dnl     __(movd %imm0,%mm1)
    2783 dnl     /* Extract required arg count.   */
    2784 dnl         __(testb %imm0_b,%imm0_b)
    2785 dnl     __(je local_label(opt))         /* skip if no required args   */
    2786 dnl     __(movzbl %imm0_b,%imm0)
    2787 dnl local_label(req_loop):     
    2788 dnl     __(compare_reg_to_nil(%arg_reg))
    2789 dnl     __(je local_label(toofew))
    2790 dnl     __(movb $fulltagmask,%imm0_bh)
    2791 dnl     __(andb %arg_reg_b,%imm0_bh)
    2792 dnl     __(cmpb $fulltag_cons,%imm0_bh)
    2793 dnl     __(jne local_label(badlist))
    2794 dnl     __(subb $1,%imm0_b)
    2795 dnl     __(pushl cons.car(%arg_reg))
    2796 dnl     __(_cdr(%arg_reg,%arg_reg))
    2797 dnl     __(jne local_label(req_loop))
    2798 dnl     __(movd %mm1,%imm0)
    2799 dnl local_label(opt):
    2800 dnl     __(movzbl %imm0_bh,%imm0)
    2801 dnl     __(test %imm0,%imm0)
    2802 dnl     __(je local_label(rest_keys))
    2803 dnl     __(btl $initopt_bit,%imm0)
    2804 dnl     __(jc local_label(opt_supp))
    2805 dnl     /* 'simple' &optionals:  no supplied-p, default to nil.   */
    2806 dnl local_label(simple_opt_loop):
    2807 dnl     __(compare_reg_to_nil(%arg_reg))
    2808 dnl     __(je local_label(default_simple_opt))
    2809 dnl     __(movb $fulltagmask,%imm0_bh)
    2810 dnl     __(andb %arg_reg_b,%imm0_bh)
    2811 dnl     __(cmpb $fulltag_cons,%imm0_bh)
    2812 dnl     __(jne local_label(badlist))
    2813 dnl     __(subb $1,%imm0_b)
    2814 dnl     __(pushl cons.car(%arg_reg))
    2815 dnl     __(_cdr(%arg_reg,%arg_reg))
    2816 dnl     __(jne local_label(simple_opt_loop))
    2817 dnl     __(jmp local_label(rest_keys))
    2818 dnl local_label(default_simple_opt):
    2819 dnl     __(subb $1,%imm0_b)
    2820 dnl     __(pushl $nil_value)
    2821 dnl     __(jne local_label(default_simple_opt))
    2822 dnl     __(jmp local_label(rest_keys))
    2823 dnl local_label(opt_supp):
    2824 dnl     __(movb $fulltagmask,%imm0_bh)
    2825 dnl     __(andb %arg_reg_b,%imm0_bh)
    2826 dnl     __(compare_reg_to_nil(%arg_z))
    2827 dnl     __(je local_label(default_hard_opt))
    2828 dnl     __(cmpb $fulltag_cons,%imm0_bh)
    2829 dnl     __(jne local_label(badlist))
    2830 dnl     __(subb $1,%imm0_b)
    2831 dnl     __(pushl cons.car(%arg_reg))
    2832 dnl     __(_cdr(%arg_reg,%arg_reg))
    2833 dnl     __(push $t_value)
    2834 dnl     __(jne local_label(opt_supp))
    2835 dnl     __(jmp local_label(rest_keys))
    2836 dnl local_label(default_hard_opt):
    2837 dnl     __(subb $1,%imm0_b)
    2838 dnl     __(push $nil_value)
    2839 dnl     __(push $nil_value)
    2840 dnl     __(jne local_label(default_hard_opt))
    2841 dnl local_label(rest_keys):     
    2842 dnl     __(btl $restp_bit,%imm0)
    2843 dnl     __(jc local_label(have_rest))
    2844 dnl     __(btl $keyp_bit,%imm0)
    2845 dnl     __(jc local_label(have_keys))
    2846 dnl     __(compare_reg_to_nil(%arg_reg))
    2847 dnl     __(jne local_label(toomany))
    2848 dnl     __(movss %fpzero,%rcontext:tcr.save0)
    2849 dnl     __(jmp *%ra0)
    2850 dnl local_label(have_rest):
    2851 dnl     __(pushl %arg_reg)
    2852 dnl     __(btl $keyp_bit,%imm0)
    2853 dnl     __(jc local_label(have_keys))
    2854 dnl     __(movss %fpzero,%rcontext:tcr.save0)
    2855 dnl     __(jmp *%ra0)
    2856 dnl     /* Ensure that arg_reg contains a proper,even-length list.  */
    2857 dnl     /* Insist that its length is <= 512 (as a cheap circularity check.)   */
    2858 dnl local_label(have_keys):
    2859 dnl     __(movl $256,%imm0)
    2860 dnl     __(push %arg_reg)
    2861 dnl     __(push %arg_z)
    2862 dnl     __(xorl %arg_z,%arg_z)
    2863 dnl local_label(count_keys_loop):
    2864 dnl     __(compare_reg_to_nil(%arg_reg))
    2865 dnl     __(je local_label(counted_keys))
    2866 dnl     __(subl $1,%imm0)
    2867 dnl     __(jl local_label(toomany))
    2868 dnl     __(movb $fulltag_mask,%arg_z_bh)
    2869 dnl     __(andb %arg_reg_b,%arg_z_bh)
    2870 dnl     __(cmpb $fulltag_cons,%arg_z_bh)
    2871 dnl     __(jne local_label(badlist))
    2872 dnl     __(_cdr(%arg_reg,%arg_reg))
    2873 dnl     __(movb $fulltag_mask,%arg_z_bh)
    2874 dnl     __(andb %arg_reg_b,%arg_z_bh)
    2875 dnl     __(cmpb $fulltag_cons,%arg_z_bh)
    2876 dnl     __(jne local_label(badlist))
    2877 dnl     __(_cdr(%arg_reg,%arg_reg))
    2878 dnl     __(jmp local_label(count_keys_loop))
    2879 dnl local_label(counted_keys):         
    2880 dnl     /* We've got a proper, even-length list of key/value pairs in  */
    2881 dnl     /* arg_reg. For each keyword var in the lambda-list, push a pair  */
    2882 dnl     /* of NILs on the vstack.   */
    2883 dnl     __(pop %arg_z)
    2884 dnl     __(pop %arg_reg)
    2885 dnl     __(movd %mm1,%imm0)
    2886 dnl     __(shrl $16,%imm0)
    2887 dnl     __(movzbl %imm0_b,%imm0)
    2888 dnl     __(movl %esp,%rcontext:tcr.unboxed0)    /* 0th value/supplied-p pair */
    2889 dnl     __(jmp local_label(push_pair_test))
    2890 dnl local_label(push_pair_loop):
    2891 dnl     __(push $nil_value)
    2892 dnl     __(push $nil_value)
    2893 dnl local_label(push_pair_test):       
    2894 dnl     __(subb $1,%imm0_b)
    2895 dnl     __(jge local_label(push_pair_loop))
    2896 dnl     __(push %temp0) /* keyword */
    2897 dnl     __(push %arg_z) /* value */
    2898 dnl     __(vector_length(%arg_y,%imm0))
    2899 dnl     __(push %arg_reg)
    2900 dnl     __(push %imm0)  /* keyword vector length */
    2901 dnl     __(movl $0,%rcontext:tcr.unboxed1) /* count of unknown keywords seen */
    2902 dnl local_label(match_keys_loop):
    2903 dnl     __(movl 4(%esp),%arg_reg)
    2904 dnl     __(compare_reg_to_nil(%arg_reg))
    2905 dnl     __(je local_label(matched_keys))
    2906 dnl     __(_car(%arg_reg,%temp0))
    2907 dnl     __(_cdr(%arg_reg,%arg_reg))
    2908 dnl     __(_car(%arg_reg,%arg_z))
    2909 dnl     __(_cdr(%arg_reg,%arg_reg))
    2910 dnl     __(movl %arg_reg,4(%esp))
    2911 dnl     __(xorl %temp1,%temp1)
    2912 dnl     __(jmp local_label(match_test))
    2913 dnl local_label(match_loop):
    2914 dnl     __(cmpl misc_data_offset(%arg_y,%temp1),%arg_z)
    2915 dnl     __(je local_label(matched))
    2916 dnl     __(addl $node_size,%temp1)
    2917 dnl local_label(match_test):
    2918 dnl     __(cmpl %temp1,(%esp))  /* compare index, keyword vector length */
    2919 dnl     __(jne local_label(match_loop))
    2920 dnl     /* No match.  Note unknown keyword, check for :allow-other-keys   */
    2921 dnl     __(addl $1,%rcontext:tcr.unboxed1)
    2922 dnl     __(cmpl $nrs.kallowotherkeys,%temp0)
    2923 dnl     __(jne local_label(match_keys_loop))
    2924 dnl     __(subl $1,%rcontext:tcr.unboxed1)
    2925 dnl     __(btsl $seen_aok_bit,%imm0)
    2926 dnl     __(jc local_label(match_keys_loop))
    2927 dnl     /* First time we've seen :allow-other-keys.  Maybe set aok_bit.   */
    2928 dnl     __(compare_reg_to_nil(%arg_z))
    2929 dnl     __(je local_label(match_keys_loop))
    2930 dnl     __(btsl $aok_bit,%imm0)
    2931 dnl     __(jmp local_label(match_keys_loop))
    2932 dnl     /* Got a match.  Worry about :allow-other-keys here, too.   */
    2933 dnl local_label(matched):
    2934 dnl     __(negl %temp1)
    2935 dnl     __(shll $1,%temp1)
    2936 dnl     __(addl %rcontext:tcr.unboxed0,%temp1)
    2937 dnl     __(cmpl $nil_value,-node_size*2(%temp1))
    2938 dnl     __(jne local_label(match_keys_loop))
    2939 dnl     __(movl %arg_z,-node_size(%temp1))
    2940 dnl     __(movl $t_value,-node_size*2(%temp1))
    2941 dnl     __(cmpl $nrs.kallowotherkeys,%temp0)
    2942 dnl     __(jne local_label(match_keys_loop))
    2943 dnl     __(btsl $seen_aok_bit,%imm0)
    2944 dnl     __(jnc local_label(match_keys_loop))
    2945 dnl     __(compare_reg_to_nil(%arg_z))
    2946 dnl     __(je local_label(match_keys_loop))
    2947 dnl     __(btsl $aok_bit,%imm0)
    2948 dnl     __(jmp local_label(match_keys_loop))
    2949 dnl local_label(matched_keys): 
    2950 dnl     __(cmpl $0,%rcontext:tcr.unboxed1)      /* any unknown keys seen? */
    2951 dnl     __(je local_label(keys_ok))
    2952 dnl     __(btl $aok_bit,%imm0)
    2953 dnl     __(jnc local_label(badkeys))
    2954 dnl local_label(keys_ok):       
    2955 dnl     __(movss %fpzero,%rcontext:tcr.save0)
    2956 dnl     __(jmp *%ra0)
    2957 dnl     /* Some unrecognized keywords.  Complain generically about   */
    2958 dnl     /* invalid keywords.   */
    2959 dnl local_label(badkeys):
    2960 dnl     __(movl $XBADKEYS,%arg_y)
    2961 dnl     __(jmp local_label(destructure_error))
    2962 dnl local_label(toomany):
    2963 dnl     __(movl $XCALLTOOMANY,%arg_y)
    2964 dnl     __(jmp local_label(destructure_error))
    2965 dnl local_label(toofew):
    2966 dnl     __(movl $XCALLTOOFEW,%arg_y)
    2967 dnl     __(jmp local_label(destructure_error))
    2968 dnl local_label(badlist):
    2969 dnl     __(movl $XCALLNOMATCH,%arg_y)
    2970 dnl local_label(destructure_error):
    2971 dnl     __(movd %mm0,%esp)              /* undo everything done to the stack */
    2972 dnl     __(movl %rcontext:tcr.save0,%arg_z)     /* %whole_reg */
    2973 dnl     __(movss %fpzero,%rcontext:tcr.save0)
    2974 dnl     __(set_nargs(2))
    2975 dnl     __(push %ra0)
    2976 dnl     __(jmp _SPksignalerr)
     2778        __(movl %ra0,%rcontext:tcr.save1)
     2779        /* Save entry %esp in case of error   */
     2780        __(movd %esp,%mm0)
     2781        /* Save arg count word */
     2782        __(movd %imm0,%mm1)
     2783        /* Extract required arg count.   */
     2784        __(testb %imm0_b,%imm0_b)
     2785        __(je local_label(opt))         /* skip if no required args   */
     2786        __(movzbl %imm0_b,%imm0)
     2787local_label(req_loop): 
     2788        __(compare_reg_to_nil(%arg_reg))
     2789        __(je local_label(toofew))
     2790        __(movb $fulltagmask,%imm0_bh)
     2791        __(andb %arg_reg_b,%imm0_bh)
     2792        __(cmpb $fulltag_cons,%imm0_bh)
     2793        __(jne local_label(badlist))
     2794        __(subb $1,%imm0_b)
     2795        __(pushl cons.car(%arg_reg))
     2796        __(_cdr(%arg_reg,%arg_reg))
     2797        __(jne local_label(req_loop))
     2798        __(movd %mm1,%imm0)
     2799local_label(opt):
     2800        __(testb %imm0_bh,%imm0_bh)
     2801        __(je local_label(rest_keys))
     2802        __(btl $initopt_bit,%imm0)
     2803        __(jc local_label(opt_supp))
     2804        /* 'simple' &optionals:  no supplied-p, default to nil.   */
     2805local_label(simple_opt_loop):
     2806        __(compare_reg_to_nil(%arg_reg))
     2807        __(je local_label(default_simple_opt))
     2808        __(movb $fulltagmask,%imm0_bh)
     2809        __(andb %arg_reg_b,%imm0_bh)
     2810        __(cmpb $fulltag_cons,%imm0_bh)
     2811        __(jne local_label(badlist))
     2812        __(subb $1,%imm0_b)
     2813        __(pushl cons.car(%arg_reg))
     2814        __(_cdr(%arg_reg,%arg_reg))
     2815        __(jne local_label(simple_opt_loop))
     2816        __(jmp local_label(rest_keys))
     2817local_label(default_simple_opt):
     2818        __(subb $1,%imm0_b)
     2819        __(pushl $nil_value)
     2820        __(jne local_label(default_simple_opt))
     2821        __(jmp local_label(rest_keys))
     2822local_label(opt_supp):
     2823        __(movb $fulltagmask,%imm0_bh)
     2824        __(andb %arg_reg_b,%imm0_bh)
     2825        __(compare_reg_to_nil(%arg_z))
     2826        __(je local_label(default_hard_opt))
     2827        __(cmpb $fulltag_cons,%imm0_bh)
     2828        __(jne local_label(badlist))
     2829        __(subb $1,%imm0_b)
     2830        __(pushl cons.car(%arg_reg))
     2831        __(_cdr(%arg_reg,%arg_reg))
     2832        __(push $t_value)
     2833        __(jne local_label(opt_supp))
     2834        __(jmp local_label(rest_keys))
     2835local_label(default_hard_opt):
     2836        __(subb $1,%imm0_b)
     2837        __(push $nil_value)
     2838        __(push $nil_value)
     2839        __(jne local_label(default_hard_opt))
     2840local_label(rest_keys):
     2841        __(btl $restp_bit,%imm0)
     2842        __(jc local_label(have_rest))
     2843        __(btl $keyp_bit,%imm0)
     2844        __(jc local_label(have_keys))
     2845        __(compare_reg_to_nil(%arg_reg))
     2846        __(jne local_label(toomany))
     2847        __(movss %fpzero,%rcontext:tcr.save0)
     2848        __(jmp *%ra0)
     2849local_label(have_rest):
     2850        __(pushl %arg_reg)
     2851        __(btl $keyp_bit,%imm0)
     2852        __(jc local_label(have_keys))
     2853        __(movss %fpzero,%rcontext:tcr.save0)
     2854        __(jmp *%ra0)
     2855        /* Ensure that arg_reg contains a proper,even-length list.  */
     2856        /* Insist that its length is <= 512 (as a cheap circularity check.)   */
     2857local_label(have_keys):
     2858        __(movb $255,%imm0_b)
     2859        __(push %arg_reg)
     2860        __(push %arg_z)
     2861        __(xorl %arg_z,%arg_z)
     2862local_label(count_keys_loop):
     2863        __(compare_reg_to_nil(%arg_reg))
     2864        __(je local_label(counted_keys))
     2865        __(subb $1,%imm0_b)
     2866        __(jb local_label(toomany))
     2867        __(movb $fulltagmask,%arg_z_bh)
     2868        __(andb %arg_reg_b,%arg_z_bh)
     2869        __(cmpb $fulltag_cons,%arg_z_bh)
     2870        __(jne local_label(badlist))
     2871        __(_cdr(%arg_reg,%arg_reg))
     2872        __(movb $fulltagmask,%arg_z_bh)
     2873        __(andb %arg_reg_b,%arg_z_bh)
     2874        __(cmpb $fulltag_cons,%arg_z_bh)
     2875        __(jne local_label(badlist))
     2876        __(_cdr(%arg_reg,%arg_reg))
     2877        __(jmp local_label(count_keys_loop))
     2878local_label(counted_keys):             
     2879        /* We've got a proper, even-length list of key/value pairs in  */
     2880        /* arg_reg. For each keyword var in the lambda-list, push a pair  */
     2881        /* of NILs on the vstack.   */
     2882        __(pop %arg_z)
     2883        __(pop %arg_reg)
     2884        __(movd %mm1,%imm0)
     2885        __(shrl $16,%imm0)
     2886        __(movzbl %imm0_b,%imm0)
     2887        __(movl %esp,%rcontext:tcr.unboxed0)    /* 0th value/supplied-p pair */
     2888        __(jmp local_label(push_pair_test))
     2889local_label(push_pair_loop):
     2890        __(push $nil_value)
     2891        __(push $nil_value)
     2892local_label(push_pair_test):   
     2893        __(subb $1,%imm0_b)
     2894        __(jge local_label(push_pair_loop))
     2895        __(push %temp0) /* keyword */
     2896        __(push %arg_z) /* value */
     2897        __(vector_length(%arg_y,%imm0))
     2898        __(push %arg_reg)
     2899        __(push %imm0)  /* keyword vector length */
     2900        __(movd %mm1,%imm0)
     2901        __(movl $0,%rcontext:tcr.unboxed1) /* count of unknown keywords seen */
     2902local_label(match_keys_loop):
     2903        __(movl 4(%esp),%arg_reg)
     2904        __(compare_reg_to_nil(%arg_reg))
     2905        __(je local_label(matched_keys))
     2906        __(_car(%arg_reg,%temp0))
     2907        __(_cdr(%arg_reg,%arg_reg))
     2908        __(_car(%arg_reg,%arg_z))
     2909        __(_cdr(%arg_reg,%arg_reg))
     2910        __(movl %arg_reg,4(%esp))
     2911        __(xorl %temp1,%temp1)
     2912        __(jmp local_label(match_test))
     2913local_label(match_loop):
     2914        __(cmpl misc_data_offset(%arg_y,%temp1),%arg_z)
     2915        __(je local_label(matched))
     2916        __(addl $node_size,%temp1)
     2917local_label(match_test):
     2918        __(cmpl %temp1,(%esp))  /* compare index, keyword vector length */
     2919        __(jne local_label(match_loop))
     2920        /* No match.  Note unknown keyword, check for :allow-other-keys   */
     2921        __(addl $1,%rcontext:tcr.unboxed1)
     2922        __(cmpl $nrs.kallowotherkeys,%temp0)
     2923        __(jne local_label(match_keys_loop))
     2924        __(subl $1,%rcontext:tcr.unboxed1)
     2925        __(btsl $seen_aok_bit,%imm0)
     2926        __(jc local_label(match_keys_loop))
     2927        /* First time we've seen :allow-other-keys.  Maybe set aok_bit.   */
     2928        __(compare_reg_to_nil(%arg_z))
     2929        __(je local_label(match_keys_loop))
     2930        __(btsl $aok_bit,%imm0)
     2931        __(jmp local_label(match_keys_loop))
     2932        /* Got a match.  Worry about :allow-other-keys here, too.   */
     2933local_label(matched):
     2934        __(negl %temp1)
     2935        __(shll $1,%temp1)
     2936        __(addl %rcontext:tcr.unboxed0,%temp1)
     2937        __(cmpl $nil_value,-node_size*2(%temp1))
     2938        __(jne local_label(match_keys_loop))
     2939        __(movl %arg_z,-node_size(%temp1))
     2940        __(movl $t_value,-node_size*2(%temp1))
     2941        __(cmpl $nrs.kallowotherkeys,%temp0)
     2942        __(jne local_label(match_keys_loop))
     2943        __(btsl $seen_aok_bit,%imm0)
     2944        __(jnc local_label(match_keys_loop))
     2945        __(compare_reg_to_nil(%arg_z))
     2946        __(je local_label(match_keys_loop))
     2947        __(btsl $aok_bit,%imm0)
     2948        __(jmp local_label(match_keys_loop))
     2949local_label(matched_keys):     
     2950        __(cmpl $0,%rcontext:tcr.unboxed1)      /* any unknown keys seen? */
     2951        __(je local_label(keys_ok))
     2952        __(btl $aok_bit,%imm0)
     2953        __(jnc local_label(badkeys))
     2954local_label(keys_ok):
     2955        __(addl $(3*node_size),%esp)
     2956        __(pop %ra0)
     2957        __(movss %fpzero,%rcontext:tcr.save0)
     2958        __(jmp *%ra0)
     2959        /* Some unrecognized keywords.  Complain generically about   */
     2960        /* invalid keywords.   */
     2961local_label(badkeys):
     2962        __(movl $XBADKEYS,%arg_y)
     2963        __(jmp local_label(destructure_error))
     2964local_label(toomany):
     2965        __(movl $XCALLTOOMANY,%arg_y)
     2966        __(jmp local_label(destructure_error))
     2967local_label(toofew):
     2968        __(movl $XCALLTOOFEW,%arg_y)
     2969        __(jmp local_label(destructure_error))
     2970local_label(badlist):
     2971        __(movl $XCALLNOMATCH,%arg_y)
     2972local_label(destructure_error):
     2973        __(movd %mm0,%esp)              /* undo everything done to the stack */
     2974        __(movl %rcontext:tcr.save0,%arg_z)     /* %whole_reg */
     2975        __(movss %fpzero,%rcontext:tcr.save0)
     2976        __(set_nargs(2))
     2977        __(push %ra0)
     2978        __(jmp _SPksignalerr)
    29772979_endfn(C(destbind1))
    29782980
    29792981_spentry(macro_bind)
    2980         __(int $3)
     2982        __(movl %arg_reg,%rcontext:tcr.save0)   /* %whole_reg */
     2983        __(extract_fulltag(%arg_reg,%imm0))
     2984        __(cmpb $fulltag_cons,%imm0_b)
     2985        __(jne 1f)
     2986        __(_cdr(%arg_reg,%arg_reg))
     2987        __(jmp C(destbind1))
     29881:      __(movl $XCALLNOMATCH,%arg_y)
     2989        __(movl %rcontext:tcr.save0,%arg_z)
     2990        __(movss %fpzero,%rcontext:tcr.save0)
     2991        __(set_nargs(2))
     2992        __(push %ra0)       
     2993        __(jmp _SPksignalerr)
     2994
    29812995_endsubp(macro_bind)
    29822996
Note: See TracChangeset for help on using the changeset viewer.