Changeset 15066
- Timestamp:
- Nov 15, 2011, 2:29:06 AM (13 years ago)
- Location:
- trunk/source/compiler/ARM
- Files:
-
- 2 edited
-
arm-vinsns.lisp (modified) (3 diffs)
-
arm2.lisp (modified) (13 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/source/compiler/ARM/arm-vinsns.lisp
r15007 r15066 863 863 ((object :lisp))) 864 864 (mov tag (:lsl object (:$ arm::fixnumshift))) 865 (and tag object(:$ (ash arm::tagmask arm::fixnumshift))))865 (and tag tag (:$ (ash arm::tagmask arm::fixnumshift)))) 866 866 867 867 (define-arm-vinsn (extract-fulltag :predicatable) … … 2685 2685 2686 2686 2687 (define-arm-vinsn (adjust-stack-register :predicatable) 2688 (() 2689 ((reg t) 2690 (amount :s16const))) 2691 (add reg reg (:$ amount))) 2692 2693 (define-arm-vinsn (adjust-vsp :predicatable) 2687 2688 2689 (define-arm-vinsn (adjust-vsp :predicatable :vsp :pop :discard) 2694 2690 (() 2695 2691 ((amount :s16const))) … … 3647 3643 ;;; Clobbers LR 3648 3644 (define-arm-vinsn %debug-trap (() 3649 ())3645 ()) 3650 3646 (uuo-debug-trap)) 3651 3647 -
trunk/source/compiler/ARM/arm2.lisp
r15058 r15066 294 294 (arm2-stack-to-register seg ea arm::arg_x) 295 295 (arm2-lri seg arm::arg_y 0) 296 (! call-subprim-3 arm::arg_z (arm::arm-subprimitive-address '.SPgvset) arm::arg_x arm::arg_y arm::arg_z)) 296 (! call-subprim-3 arm::arg_z (arm::arm-subprimitive-address '.SPgvset) arm::arg_x arm::arg_y arm::arg_z) 297 (setq valreg arm::arg_z)) 297 298 ((memory-spec-p ea) ; vstack slot 298 299 (arm2-register-to-stack seg valreg ea)) … … 2853 2854 address-reg)) 2854 2855 2856 (defun arm2-push-reg-for-form (seg form suggested &optional targeted) 2857 (let* ((reg (if (and (node-reg-p suggested) 2858 (nx2-acode-call-p form)) ;probably ... 2859 (arm2-one-targeted-reg-form seg form arm::arg_z) 2860 (if targeted 2861 (arm2-one-targeted-reg-form seg form suggested) 2862 (arm2-one-untargeted-reg-form seg form suggested))))) 2863 (arm2-push-register seg reg))) 2855 2864 2856 2865 (defun arm2-one-lreg-form (seg form lreg) … … 2875 2884 (%get-regspec-mode y))))))) 2876 2885 2877 (defun arm2-one-untargeted-reg-form (seg form suggested) 2886 ;;; If REG is a node reg, add it to the bitmask. 2887 (defun arm2-restrict-node-target (reg mask) 2888 (if (node-reg-p reg) 2889 (logior mask (ash 1 (hard-regspec-value reg))) 2890 mask)) 2891 2892 ;;; If suggested reg is a node reg that contains a stack location, 2893 ;;; try to use some other node temp. 2894 (defun arm2-try-non-conflicting-reg (suggested reserved) 2895 (let* ((mask *arm2-gpr-locations-valid-mask*)) 2896 (or (when (and (node-reg-p suggested) 2897 (logbitp (hard-regspec-value suggested) mask)) 2898 (setq mask (logior mask reserved)) 2899 (%available-node-temp (logand *available-backend-node-temps* 2900 (lognot mask)))) 2901 suggested))) 2902 2903 (defun arm2-one-untargeted-reg-form (seg form suggested &optional (reserved 0)) 2878 2904 (or (arm2-reg-for-form form suggested) 2879 (with-arm-local-vinsn-macros (seg) 2880 (let* ((gpr-p (= (hard-regspec-class suggested) hard-reg-class-gpr)) 2881 (node-p (if gpr-p (= (get-regspec-mode suggested) hard-reg-class-gpr-mode-node)))) 2882 (if node-p 2883 (if (and (acode-p form) 2884 (eq (acode-operator form) (%nx1-operator %current-tcr))) 2885 arm::rcontext 2886 (arm2-one-untargeted-lreg-form seg form suggested)) 2887 (arm2-one-untargeted-lreg-form seg form suggested)))))) 2905 (if (and (acode-p form) 2906 (eq (acode-operator form) (%nx1-operator %current-tcr))) 2907 arm::rcontext 2908 (if (node-reg-p suggested) 2909 (arm2-one-untargeted-lreg-form seg form (arm2-try-non-conflicting-reg suggested reserved)) 2910 (arm2-one-untargeted-lreg-form seg form suggested))))) 2888 2911 2889 2912 … … 2941 2964 (hard-regspec-value popped-reg))) 2942 2965 (sp-p (vinsn-attribute-p push-vinsn :csp))) 2943 (when (and sp-p t); vsp case is harder.2966 (when sp-p ; vsp case is harder. 2944 2967 (unless (vinsn-sequence-has-attribute-p push-vinsn pop-vinsn :csp :discard) 2945 2968 (let* ((pushed-reg-is-set (vinsn-sequence-sets-reg-p … … 2991 3014 (insert-dll-node-before restore pop-vinsn) 2992 3015 (elide-vinsn push-vinsn) 2993 (elide-vinsn pop-vinsn))))))))))))) 3016 (elide-vinsn pop-vinsn)))))))))) 3017 (when (and (vinsn-attribute-p push-vinsn :vsp)) 3018 (unless (or 3019 (vinsn-sequence-has-attribute-p push-vinsn pop-vinsn :vsp :push) 3020 (vinsn-sequence-has-attribute-p push-vinsn pop-vinsn :vsp :pop) 3021 (let* ((pushed-reg-is-set (vinsn-sequence-sets-reg-p 3022 push-vinsn pop-vinsn pushed-reg)) 3023 (popped-reg-is-set (if same-reg 3024 pushed-reg-is-set 3025 (vinsn-sequence-sets-reg-p 3026 push-vinsn pop-vinsn popped-reg))) 3027 (popped-reg-is-reffed (unless same-reg 3028 (vinsn-sequence-refs-reg-p 3029 push-vinsn pop-vinsn popped-reg)))) 3030 (cond ((and (not (and pushed-reg-is-set popped-reg-is-set)) 3031 (or (null popped-reg-is-reffed) 3032 (vinsn-in-sequence-p pushed-reg-is-set popped-reg-is-reffed pop-vinsn))) 3033 ;; We don't try this if anything's pushed on 3034 ;; or popped from the vstack in the 3035 ;; sequence, but there can be references to 3036 ;; other things that were pushed earlier. 3037 ;; Those references use the vstack depth at 3038 ;; the time of the reference and the 3039 ;; canonical frame offset to address 3040 ;; relative to the vsp. If we elide the 3041 ;; push, the vstack depth will be 4 bytes 3042 ;; less than when the reference was 3043 ;; generated. Fix that up ... There was 3044 ;; (once) a notion of modeling the vstack as 3045 ;; a list of "lcells"; lcells had a width 3046 ;; attribute that was usually the native 3047 ;; word size. Eliding a push involved 3048 ;; setting the width of the lcell 3049 ;; representing the pushed word to 0. 3050 ;; That whole idea was never fully implemented, 3051 ;; though we generally try to maintain the model. 3052 ;; If it ever is implemented, we need to dtrt 3053 ;; here. 3054 (do* ((element (dll-node-succ push-vinsn) (dll-node-succ element))) 3055 ((eq element pop-vinsn)) 3056 (when (typep element 'vinsn) 3057 (let* ((template (vinsn-template element)) 3058 (opidx (case (vinsn-template-name template) 3059 (vframe-store 2) 3060 (vframe-load 2)))) 3061 (when opidx 3062 (let* ((operands (vinsn-variable-parts element))) 3063 (declare (simple-vector operands)) 3064 (setf (svref operands opidx) 3065 (the fixnum 3066 (- (the fixnum (svref operands opidx)) 3067 arm::node-size)))))))) 3068 3069 3070 3071 (unless same-reg 3072 (let* ((copy (! copy-gpr popped-reg pushed-reg))) 3073 (remove-dll-node copy) 3074 (if popped-reg-is-reffed 3075 (insert-dll-node-after copy popped-reg-is-reffed) 3076 (if pushed-reg-is-set 3077 (insert-dll-node-after copy push-vinsn) 3078 (insert-dll-node-before copy push-vinsn))))) 3079 (elide-vinsn push-vinsn) 3080 (elide-vinsn pop-vinsn)) 3081 (t ; maybe allocate a node temp 3082 ))))))))) 2994 3083 2995 3084 … … 3006 3095 (if atriv 3007 3096 (arm2-one-targeted-reg-form seg aform areg) 3008 (setq apushed (arm2-push-reg ister seg (arm2-one-untargeted-reg-form seg aform (arm2-acc-reg-for areg))))))3097 (setq apushed (arm2-push-reg-for-form seg aform areg t)))) 3009 3098 (arm2-one-targeted-reg-form seg bform breg) 3010 3099 (if aconst … … 3034 3123 (let* ((*available-backend-imm-temps* *available-backend-imm-temps*) 3035 3124 (avar (arm2-lexical-reference-p aform)) 3036 (adest areg)3037 (bdest breg)3125 (adest nil) 3126 (bdest nil) 3038 3127 (atriv (and (arm2-trivial-p bform) (nx2-node-gpr-p breg))) 3039 3128 (aconst (and (not atriv) (or (arm-side-effect-free-form-p aform) 3040 3129 (if avar (arm2-var-not-set-by-form-p avar bform))))) 3041 (apushed (not (or atriv aconst)))) 3130 (apushed nil) 3131 (restricted 0)) 3042 3132 (progn 3043 3133 (unless aconst 3044 3134 (if atriv 3045 3135 (progn 3046 (setq adest (arm2-one-untargeted-reg-form seg aform areg)) 3136 (setq adest (arm2-one-untargeted-reg-form seg aform areg) 3137 restricted (arm2-restrict-node-target adest 0)) 3047 3138 (when (imm-reg-p adest) 3048 3139 (use-imm-temp (%hard-regspec-value adest))) 3049 3140 (when (same-arm-reg-p adest breg) 3050 3141 (setq breg areg))) 3051 (setq apushed (arm2-push-register seg (arm2-one-untargeted-reg-form seg aform (arm2-acc-reg-for areg)))))) 3052 (if (setq bdest (arm2-reg-for-form bform breg)) 3053 (when (same-arm-reg-p bdest areg) 3054 (setq areg breg)) 3055 (setq bdest (arm2-one-untargeted-reg-form seg bform breg))) 3142 (setq apushed (arm2-push-reg-for-form seg aform areg)))) 3143 (setq bdest (arm2-one-untargeted-reg-form seg bform breg restricted) 3144 restricted (arm2-restrict-node-target bdest restricted)) 3145 (unless adest 3146 (if (same-arm-reg-p areg bdest) 3147 (setq areg breg))) 3056 3148 (if aconst 3057 3149 (progn 3058 3150 (if (imm-reg-p bdest) 3059 3151 (use-imm-temp (%hard-regspec-value bdest))) 3060 (setq adest (arm2-one-untargeted-reg-form seg aform areg )))3152 (setq adest (arm2-one-untargeted-reg-form seg aform areg restricted))) 3061 3153 (if apushed 3062 (arm2-elide-pushes seg apushed (arm2-pop-register seg areg)))))3154 (arm2-elide-pushes seg apushed (arm2-pop-register seg (setq adest areg)))))) 3063 3155 (values adest bdest)))))) 3064 3156 … … 3107 3199 (if atriv 3108 3200 (arm2-one-targeted-reg-form seg aform areg) 3109 (setq apushed (arm2-push-reg ister seg (arm2-one-untargeted-reg-form seg aform (arm2-acc-reg-for areg))))))3201 (setq apushed (arm2-push-reg-for-form seg aform areg t)))) 3110 3202 (if (and bform (not bconst)) 3111 3203 (if btriv 3112 3204 (arm2-one-targeted-reg-form seg bform breg) 3113 (setq bpushed (arm2-push-reg ister seg (arm2-one-untargeted-reg-form seg bform (arm2-acc-reg-for breg))))))3205 (setq bpushed (arm2-push-reg-for-form seg bform breg t)))) 3114 3206 (if (and cform (not cconst)) 3115 3207 (if ctriv 3116 3208 (arm2-one-targeted-reg-form seg cform creg) 3117 (setq cpushed (arm2-push-reg ister seg (arm2-one-untargeted-reg-form seg cform (arm2-acc-reg-for creg))))))3209 (setq cpushed (arm2-push-reg-for-form seg cform creg t)))) 3118 3210 (arm2-one-targeted-reg-form seg dform dreg) 3119 3211 (unless ctriv … … 3158 3250 (if atriv 3159 3251 (arm2-one-targeted-reg-form seg aform areg) 3160 (setq apushed (arm2-push-reg ister seg (arm2-one-untargeted-reg-form seg aform (arm2-acc-reg-for areg))))))3252 (setq apushed (arm2-push-reg-for-form seg aform areg t)))) 3161 3253 (if (and bform (not bconst)) 3162 3254 (if btriv 3163 3255 (arm2-one-targeted-reg-form seg bform breg) 3164 (setq bpushed (arm2-push-reg ister seg (arm2-one-untargeted-reg-form seg bform (arm2-acc-reg-for breg))))))3256 (setq bpushed (arm2-push-reg-for-form seg bform breg t)))) 3165 3257 (arm2-one-targeted-reg-form seg cform creg) 3166 3258 (unless btriv … … 3197 3289 (let ((bvar (arm2-lexical-reference-p bform))) 3198 3290 (and bvar (arm2-var-not-set-by-form-p bvar cform)))))) 3199 (adest areg)3200 (bdest breg)3201 (cdest creg)3291 (adest nil) 3292 (bdest nil) 3293 (cdest nil) 3202 3294 (apushed nil) 3203 (bpushed nil)) 3204 (if (and aform (not aconst)) 3295 (bpushed nil) 3296 (restricted 0)) 3297 (when (and aform (not aconst)) 3205 3298 (if atriv 3206 3299 (progn 3207 (setq adest (arm2-one-untargeted-reg-form seg aform ($ areg))) 3300 (setq adest (arm2-one-untargeted-reg-form seg aform ($ areg)) 3301 restricted (arm2-restrict-node-target adest 0)) 3208 3302 (when (same-arm-reg-p adest breg) 3209 3303 (setq breg areg)) 3210 3304 (when (same-arm-reg-p adest creg) 3211 3305 (setq creg areg))) 3212 (setq apushed (arm2-push-reg ister seg (arm2-one-untargeted-reg-form seg aform (arm2-acc-reg-for areg))))))3213 ( if(and bform (not bconst))3306 (setq apushed (arm2-push-reg-for-form seg aform areg )))) 3307 (when (and bform (not bconst)) 3214 3308 (if btriv 3215 3309 (progn 3216 (setq bdest (arm2-one-untargeted-reg-form seg bform ($ breg))) 3310 (setq bdest (arm2-one-untargeted-reg-form seg bform ($ breg) restricted) 3311 restricted (arm2-restrict-node-target bdest restricted)) 3217 3312 (when (same-arm-reg-p bdest creg) 3218 3313 (setq creg breg)) 3219 3314 (when (same-arm-reg-p bdest areg) 3220 3315 (setq areg breg))) 3221 (setq bpushed (arm2-push-register seg (arm2-one-untargeted-reg-form seg bform (arm2-acc-reg-for breg)))))) 3222 (setq cdest (arm2-one-untargeted-reg-form seg cform creg)) 3316 (setq bpushed (arm2-push-reg-for-form seg bform breg)))) 3317 (setq cdest (arm2-one-untargeted-reg-form seg cform creg restricted) 3318 restricted (arm2-restrict-node-target cdest restricted)) 3223 3319 (when (same-arm-reg-p cdest areg) 3224 3320 (setq areg creg)) … … 3227 3323 (unless btriv 3228 3324 (if bconst 3229 (setq bdest (arm2-one-untargeted-reg-form seg bform breg)) 3230 (arm2-elide-pushes seg bpushed (arm2-pop-register seg breg)))) 3325 (setq bdest (arm2-one-untargeted-reg-form seg bform breg restricted)) 3326 (arm2-elide-pushes seg bpushed (arm2-pop-register seg (setq bdest breg)))) 3327 (setq restricted (arm2-restrict-node-target bdest restricted)) 3328 (when (same-arm-reg-p bdest areg) 3329 (setq areg breg))) 3231 3330 (unless atriv 3232 3331 (if aconst 3233 (setq adest (arm2-one-untargeted-reg-form seg aform areg ))3234 (arm2-elide-pushes seg apushed (arm2-pop-register seg areg))))3332 (setq adest (arm2-one-untargeted-reg-form seg aform areg restricted)) 3333 (arm2-elide-pushes seg apushed (arm2-pop-register seg (setq adest areg))))) 3235 3334 (values adest bdest cdest)))) 3236 3335 … … 3273 3372 (and cvar 3274 3373 (arm2-var-not-set-by-form-p cvar dform)))))) 3275 (adest areg)3276 (bdest breg)3277 (cdest creg)3278 (ddest dreg)3374 (adest nil) 3375 (bdest nil) 3376 (cdest nil) 3377 (ddest nil) 3279 3378 (apushed nil) 3280 3379 (bpushed nil) 3281 (cpushed nil)) 3380 (cpushed nil) 3381 (restricted 0)) 3282 3382 (if (and aform (not aconst)) 3283 3383 (if atriv 3284 3384 (progn 3285 (setq adest (arm2-one-targeted-reg-form seg aform areg)) 3385 (setq adest (arm2-one-untargeted-reg-form seg aform areg) 3386 restricted (arm2-restrict-node-target adest restricted)) 3286 3387 (when (same-arm-reg-p adest breg) 3287 3388 (setq breg areg)) … … 3290 3391 (when (same-arm-reg-p adest dreg) 3291 3392 (setq dreg areg))) 3292 (setq apushed (arm2-push-reg ister seg (arm2-one-untargeted-reg-form seg aform (arm2-acc-reg-for areg))))))3393 (setq apushed (arm2-push-reg-for-form seg aform areg)))) 3293 3394 (if (and bform (not bconst)) 3294 3395 (if btriv 3295 3396 (progn 3296 (setq bdest (arm2-one-untargeted-reg-form seg bform breg)) 3397 (setq bdest (arm2-one-untargeted-reg-form seg bform breg restricted) 3398 restricted (arm2-restrict-node-target bdest restricted)) 3399 (unless adest 3400 (when (same-arm-reg-p areg bdest) 3401 (setq areg breg))) 3297 3402 (when (same-arm-reg-p bdest creg) 3298 3403 (setq creg breg)) 3299 3404 (when (same-arm-reg-p bdest dreg) 3300 3405 (setq dreg breg))) 3301 (setq bpushed (arm2-push-reg ister seg (arm2-one-untargeted-reg-form seg bform (arm2-acc-reg-for breg))))))3406 (setq bpushed (arm2-push-reg-for-form seg bform breg)))) 3302 3407 (if (and cform (not cconst)) 3303 3408 (if ctriv 3304 3409 (progn 3305 (setq cdest (arm2-one-untargeted-reg-form seg cform creg)) 3410 (setq cdest (arm2-one-untargeted-reg-form seg cform creg restricted) 3411 restricted (arm2-restrict-node-target bdest restricted)) 3412 (unless adest 3413 (when (same-arm-reg-p areg cdest) 3414 (setq areg creg))) 3415 (unless bdest 3416 (when (same-arm-reg-p breg cdest) 3417 (setq breg creg))) 3306 3418 (when (same-arm-reg-p cdest dreg) 3307 3419 (setq dreg creg))) 3308 (setq cpushed (arm2-push-register seg (arm2-one-untargeted-reg-form seg cform (arm2-acc-reg-for creg)))))) 3309 (setq ddest (arm2-one-untargeted-reg-form seg dform dreg)) 3310 (when (same-arm-reg-p ddest areg) 3311 (setq areg dreg)) 3312 (when (same-arm-reg-p ddest breg) 3313 (setq breg dreg)) 3314 (when (same-arm-reg-p ddest creg) 3315 (setq creg dreg)) 3420 (setq cpushed (arm2-push-reg-for-form seg cform creg)))) 3421 (setq ddest (arm2-one-untargeted-reg-form seg dform dreg restricted) 3422 restricted (arm2-restrict-node-target ddest restricted)) 3423 (unless adest 3424 (when (same-arm-reg-p ddest areg) 3425 (setq areg dreg))) 3426 (unless bdest 3427 (when (same-arm-reg-p ddest breg) 3428 (setq breg dreg))) 3429 (unless cdest 3430 (when (same-arm-reg-p ddest creg) 3431 (setq creg dreg))) 3316 3432 (unless ctriv 3317 3433 (if cconst 3318 (setq cdest (arm2-one-untargeted-reg-form seg cform creg)) 3319 (arm2-elide-pushes seg cpushed (arm2-pop-register seg creg)))) 3434 (setq cdest (arm2-one-untargeted-reg-form seg cform creg restricted)) 3435 (arm2-elide-pushes seg cpushed (arm2-pop-register seg (setq cdest creg)))) 3436 (setq restricted (arm2-restrict-node-target cdest restricted)) 3437 (unless adest 3438 (when (same-arm-reg-p cdest areg) 3439 (setq areg creg))) 3440 (unless bdest 3441 (when (same-arm-reg-p ddest breg) 3442 (setq breg creg)))) 3320 3443 (unless btriv 3321 3444 (if bconst 3322 (setq bdest (arm2-one-untargeted-reg-form seg bform breg)) 3323 (arm2-elide-pushes seg bpushed (arm2-pop-register seg breg)))) 3445 (setq bdest (arm2-one-untargeted-reg-form seg bform breg restricted)) 3446 (arm2-elide-pushes seg bpushed (arm2-pop-register seg breg))) 3447 (setq restricted (arm2-restrict-node-target bdest restricted)) 3448 (unless adest 3449 (when (same-arm-reg-p bdest areg) 3450 (setq areg breg)))) 3324 3451 (unless atriv 3325 3452 (if aconst 3326 (setq adest (arm2-one-untargeted-reg-form seg aform areg ))3453 (setq adest (arm2-one-untargeted-reg-form seg aform areg restricted)) 3327 3454 (arm2-elide-pushes seg apushed (arm2-pop-register seg areg)))) 3328 3455 (values adest bdest cdest ddest)))
Note:
See TracChangeset
for help on using the changeset viewer.
