Changeset 9690
- Timestamp:
- Jun 6, 2008, 9:44:08 PM (16 years ago)
- File:
-
- 1 edited
-
branches/ia32/lisp-kernel/x86-spentry32.s (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
branches/ia32/lisp-kernel/x86-spentry32.s
r9683 r9690 2776 2776 /* %arg_reg is %temp1, key vector in %arg_y */ 2777 2777 _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) 2787 local_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) 2799 local_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. */ 2805 local_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)) 2817 local_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)) 2822 local_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)) 2835 local_label(default_hard_opt): 2836 __(subb $1,%imm0_b) 2837 __(push $nil_value) 2838 __(push $nil_value) 2839 __(jne local_label(default_hard_opt)) 2840 local_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) 2849 local_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.) */ 2857 local_label(have_keys): 2858 __(movb $255,%imm0_b) 2859 __(push %arg_reg) 2860 __(push %arg_z) 2861 __(xorl %arg_z,%arg_z) 2862 local_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)) 2878 local_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)) 2889 local_label(push_pair_loop): 2890 __(push $nil_value) 2891 __(push $nil_value) 2892 local_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 */ 2902 local_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)) 2913 local_label(match_loop): 2914 __(cmpl misc_data_offset(%arg_y,%temp1),%arg_z) 2915 __(je local_label(matched)) 2916 __(addl $node_size,%temp1) 2917 local_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. */ 2933 local_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)) 2949 local_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)) 2954 local_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. */ 2961 local_label(badkeys): 2962 __(movl $XBADKEYS,%arg_y) 2963 __(jmp local_label(destructure_error)) 2964 local_label(toomany): 2965 __(movl $XCALLTOOMANY,%arg_y) 2966 __(jmp local_label(destructure_error)) 2967 local_label(toofew): 2968 __(movl $XCALLTOOFEW,%arg_y) 2969 __(jmp local_label(destructure_error)) 2970 local_label(badlist): 2971 __(movl $XCALLNOMATCH,%arg_y) 2972 local_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) 2977 2979 _endfn(C(destbind1)) 2978 2980 2979 2981 _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)) 2988 1: __(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 2981 2995 _endsubp(macro_bind) 2982 2996
Note:
See TracChangeset
for help on using the changeset viewer.
