Changeset 15847


Ignore:
Timestamp:
Jun 22, 2013, 2:05:55 AM (6 years ago)
Author:
gb
Message:

Restore old PPC destructuring subprims, which were prematurely removed
from 1.9.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/source/lisp-kernel/ppc-spentry.s

    r15842 r15847  
    34613461/* Deprecated */       
    34623462_spentry(poweropen_ffcallX)
     3463        .long 0x7c800008        /* debug trap */
     3464
     3465
     3466/* Destructuring-bind, macro-bind.  */
     3467   
     3468/* OK to use arg_x, arg_y for whatever (tagged) purpose;  */
     3469/* likewise immX regs.  */
     3470/* arg_z preserved, nothing else in particular defined on exit.  */
     3471/* nargs contains req count (0-255) in PPC bits mask_req_start/mask_req_width,  */
     3472/* opt count (0-255) in PPC bits mask_opt_start/mask_opt_width,  */
     3473/* key count (0-255) in PPC bits mask_key_start/mask_key_width,  */
     3474/* opt-supplied-p flag in PPC bit mask_initopt,  */
     3475/* keyp flag in PPC bit mask_keyp,  */
     3476/* &allow-other-keys flag in PPC bit mask_aok,  */
     3477/* &rest flag in PPC bit mask_restp.  */
     3478/* When mask_keyp bit is set, keyvect contains vector of keyword symbols,  */
     3479/* length key count.  */
     3480
    34633481_spentry(macro_bind)
     3482        __ifdef(`PPC64')
     3483         __(mr whole_reg,arg_reg)
     3484         __(extract_fulltag(imm0,arg_reg))
     3485         __(cmpri(cr1,arg_reg,nil_value))
     3486         __(cmpri(cr0,imm0,fulltag_cons))
     3487         __(beq cr1,0f)
     3488         __(bne- cr0,1f)
     34890:             
     3490         __(_cdr(arg_reg,arg_reg))
     3491         __(b local_label(destbind1))
     3492        __else
     3493         __(mr whole_reg,arg_reg)
     3494         __(extract_lisptag(imm0,arg_reg))
     3495         __(cmpri(cr0,imm0,tag_list))
     3496         __(bne- cr0,1f)
     3497         __(_cdr(arg_reg,arg_reg))
     3498         __(b (local_label(destbind1)))
     3499        __endif
     35001:
     3501        __(li arg_y,XCALLNOMATCH)
     3502        __(mr arg_z,whole_reg)
     3503        __(set_nargs(2))
     3504        __(b _SPksignalerr)
     3505
     3506
    34643507_spentry(destructuring_bind)
     3508        __(mr whole_reg,arg_reg)
     3509        __(b local_label(destbind1))
     3510       
    34653511_spentry(destructuring_bind_inner)
    3466         .long 0x7c800008        /* debug trap */
     3512        __(mr whole_reg,arg_z)
     3513local_label(destbind1):
     3514        /* Extract required arg count.  */
     3515        /* A bug in gas: can't handle shift count of "32" (= 0  */
     3516        ifelse(eval(mask_req_width+mask_req_start),eval(32),`
     3517        __(clrlwi. imm0,nargs,mask_req_start)
     3518        ',`
     3519        __(extrwi. imm0,nargs,mask_req_width,mask_req_start)
     3520        ')
     3521        __(extrwi imm1,nargs,mask_opt_width,mask_opt_start)
     3522        __(rlwinm imm2,nargs,0,mask_initopt,mask_initopt)
     3523        __(rlwinm imm4,nargs,0,mask_keyp,mask_keyp)
     3524        __(cmpri(cr4,imm4,0))
     3525        __(rlwinm imm4,nargs,0,mask_restp,mask_restp)
     3526        __(cmpri(cr5,imm4,0))
     3527        __(cmpri(cr1,imm1,0))
     3528        __(cmpri(cr2,imm2,0))
     3529        /* Save entry vsp in case of error.  */
     3530        __(mr imm4,vsp)
     3531        __(beq cr0,2f)
     35321:
     3533        __(cmpri(cr7,arg_reg,nil_value))
     3534        __ifdef(`PPC64')
     3535         __(extract_fulltag(imm3,arg_reg))
     3536         __(cmpri(cr3,imm3,fulltag_cons))
     3537        __else       
     3538         __(extract_lisptag(imm3,arg_reg))
     3539         __(cmpri(cr3,imm3,tag_list))
     3540        __endif
     3541        __(subi imm0,imm0,1)
     3542        __(cmpri(cr0,imm0,0))
     3543        __(beq cr7,toofew)
     3544        __(bne cr3,badlist)
     3545        __(ldr(arg_x,cons.car(arg_reg)))
     3546        __(ldr(arg_reg,cons.cdr(arg_reg)))
     3547        __(vpush(arg_x))
     3548        __(bne cr0,1b)
     35492:
     3550        __(beq cr1,rest_keys)
     3551        __(bne cr2,opt_supp)
     3552        /* 'simple' &optionals:  no supplied-p, default to nil.  */
     3553simple_opt_loop:
     3554        __(cmpri(cr0,arg_reg,nil_value))
     3555        __ifdef(`PPC64')
     3556         __(extract_fulltag(imm3,arg_reg))
     3557         __(cmpri(cr3,imm3,fulltag_cons))
     3558        __else
     3559         __(extract_lisptag(imm3,arg_reg))
     3560         __(cmpri(cr3,imm3,tag_list))
     3561        __endif
     3562        __(subi imm1,imm1,1)
     3563        __(cmpri(cr1,imm1,0))
     3564        __(li imm5,nil_value)
     3565        __(beq cr0,default_simple_opt)
     3566        __(bne cr3,badlist)
     3567        __(ldr(arg_x,cons.car(arg_reg)))
     3568        __(ldr(arg_reg,cons.cdr(arg_reg)))
     3569        __(vpush(arg_x))
     3570        __(bne cr1,simple_opt_loop)
     3571        __(b rest_keys)
     3572default_simple_opt_loop:
     3573        __(subi imm1,imm1,1)
     3574        __(cmpri(cr1,imm1,0))
     3575default_simple_opt:
     3576        __(vpush(imm5))
     3577        __(bne cr1,default_simple_opt_loop)
     3578        __(b rest_keys)
     3579        /* Provide supplied-p vars for the &optionals.  */
     3580opt_supp:
     3581        __(li arg_y,t_value)
     3582opt_supp_loop:
     3583        __(cmpri(cr0,arg_reg,nil_value))
     3584        __ifdef(`PPC64')
     3585         __(extract_fulltag(imm3,arg_reg))
     3586         __(cmpri(cr3,imm3,fulltag_cons))
     3587        __else       
     3588         __(extract_lisptag(imm3,arg_reg))
     3589         __(cmpri(cr3,imm3,tag_list))
     3590        __endif
     3591        __(subi imm1,imm1,1)
     3592        __(cmpri(cr1,imm1,0))
     3593        __(beq cr0,default_hard_opt)
     3594        __(bne cr3,badlist)
     3595        __(ldr(arg_x,cons.car(arg_reg)))
     3596        __(ldr(arg_reg,cons.cdr(arg_reg)))
     3597        __(vpush(arg_x))
     3598        __(vpush(arg_y))
     3599        __(bne cr1,opt_supp_loop)
     3600        __(b rest_keys)
     3601default_hard_opt_loop:
     3602        __(subi imm1,imm1,1)
     3603        __(cmpri(cr1,imm1,0))
     3604default_hard_opt:
     3605        __(vpush(imm5))
     3606        __(vpush(imm5))
     3607        __(bne cr1,default_hard_opt_loop)
     3608rest_keys:
     3609        __(cmpri(cr0,arg_reg,nil_value))
     3610        __(bne cr5,have_rest)
     3611        __(bne cr4,have_keys)
     3612        __(bne cr0,toomany)
     3613        __(blr)
     3614have_rest:
     3615        __(vpush(arg_reg))
     3616        __(beqlr cr4)
     3617have_keys:
     3618        /* Ensure that arg_reg contains a proper,even-length list.  */
     3619        /* Insist that its length is <= 512 (as a cheap circularity check.)  */
     3620        __(li imm0,256)
     3621        __(mr arg_x,arg_reg)
     3622count_keys_loop:
     3623        __ifdef(`PPC64')
     3624         __(extract_fulltag(imm3,arg_x))
     3625         __(cmpri(cr3,imm3,fulltag_cons))
     3626        __else
     3627         __(extract_lisptag(imm3,arg_x))
     3628         __(cmpri(cr3,imm3,tag_list))
     3629        __endif
     3630        __(cmpri(cr0,arg_x,nil_value))
     3631        __(subi imm0,imm0,1)
     3632        __(cmpri(cr4,imm0,0))
     3633        __(beq cr0,counted_keys)
     3634        __(bne cr3,badlist)
     3635        __(ldr(arg_x,cons.cdr(arg_x)))
     3636        __ifdef(`PPC64')
     3637         __(extract_fulltag(imm3,arg_x))
     3638         __(cmpri(cr3,imm3,fulltag_cons))
     3639        __else
     3640         __(extract_lisptag(imm3,arg_x))
     3641         __(cmpri(cr3,imm3,tag_list))
     3642        __endif
     3643        __(blt cr4,toomany)
     3644        __(cmpri(cr0,arg_x,nil_value))
     3645        __(beq cr0,db_badkeys)
     3646        __(bne cr3,badlist)
     3647        __(ldr(arg_x,cons.cdr(arg_x)))
     3648        __(b count_keys_loop)
     3649counted_keys:
     3650        /* We've got a proper, even-length list of key/value pairs in */
     3651        /* arg_reg. For each keyword var in the lambda-list, push a pair */
     3652        /* of NILs on the vstack.  */
     3653        __(extrwi. imm0,nargs,mask_key_width,mask_key_start )
     3654        __(mr imm2,imm0)        /* save number of keys  */
     3655        __(li imm5,nil_value)
     3656        __(b push_pair_test)
     3657push_pair_loop:
     3658        __(cmpri(cr0,imm0,1))
     3659        __(subi imm0,imm0,1)
     3660        __(vpush(imm5))
     3661        __(vpush(imm5))
     3662push_pair_test:
     3663        __(bne cr0,push_pair_loop)
     3664        __(slwi imm2,imm2,dnode_shift)  /* pairs -> bytes  */
     3665        __(add imm2,vsp,imm2)           /* imm2 points below pairs  */
     3666        __(li imm0,0)                   /* count unknown keywords so far  */
     3667        __(extrwi imm1,nargs,1,mask_aok) /* unknown keywords allowed  */
     3668        __(extrwi nargs,nargs,mask_key_width,mask_key_start)
     3669        /* Now, for each keyword/value pair in the list  */
     3670        /*  a) if the keyword is found in the keyword vector, set the  */
     3671        /*     corresponding entry on the vstack to the value and the  */
     3672        /*     associated supplied-p var to T.  */
     3673        /*  b) Regardless of whether or not the keyword is found,  */
     3674        /*     if :ALLOW-OTHER-KEYS is provided with a non-nil value, */
     3675        /*     set the low bit of imm1 to indicate that unknown keywords  */
     3676        /*     are acceptable. (This bit is pre-set above to the value */
     3677        /*     the encoded value of &allow_other_keys.) */
     3678        /*  c) If the keyword is not found (and isn't :ALLOW-OTHER-KEYS), increment  */
     3679        /*     the count of unknown keywords in the high bits of imm1*/
     3680        /* At the end of the list, signal an error if any unknown keywords were seen  */
     3681        /* but not allowed.  Otherwise, return.  */
     3682
     3683match_keys_loop:
     3684        __(cmpri(cr0,arg_reg,nil_value))
     3685        __(li imm0,0)
     3686        __(li imm3,misc_data_offset)
     3687        __(beq cr0,matched_keys)
     3688        __(ldr(arg_x,cons.car(arg_reg)))
     3689        __(li arg_y,nrs.kallowotherkeys)
     3690        __(cmpr(cr3,arg_x,arg_y))       /* :ALLOW-OTHER-KEYS ?  */
     3691        __(ldr(arg_reg,cons.cdr(arg_reg)))
     3692        __(ldr(arg_y,cons.car(arg_reg)))
     3693        __(cmpr(cr4,imm0,nargs))
     3694        __(ldr(arg_reg,cons.cdr(arg_reg)))
     3695        __(b match_test)
     3696match_loop:
     3697        __(ldrx(temp0,keyvect_reg,imm3))
     3698        __(cmpr(cr0,arg_x,temp0))
     3699        __(addi imm0,imm0,1)
     3700        __(cmpr(cr4,imm0,nargs))
     3701        __(addi imm3,imm3,node_size)
     3702        __(bne cr0,match_test)
     3703        /* Got a hit.  Unless this keyword's been seen already, set it.  */
     3704        __(slwi imm0,imm0,dnode_shift)
     3705        __(subf imm0,imm0,imm2)
     3706        __(ldr(temp0,0(imm0)))
     3707        __(cmpri(cr0,temp0,nil_value))
     3708        __(li temp0,t_value)
     3709        __(bne cr0,match_keys_loop)     /* already saw this  */
     3710        __(str(arg_y,node_size*1(imm0)))
     3711        __(str(temp0,node_size*0(imm0)))
     3712        __(bne cr3,match_keys_loop)
     3713        __(b match_keys_check_aok)
     3714match_test:
     3715        __(bne cr4,match_loop)
     3716        __(beq cr3,match_keys_check_aok)
     3717        __(addi imm1,imm1,node_size)
     3718        __(b match_keys_loop)
     3719match_keys_check_aok:
     3720        __(andi. imm0,imm1,2)  /* check "seen-aok" bit in imm1 */
     3721        __(cmpri cr1,arg_y,nil_value) /* check value */
     3722        __(ori imm1,imm1,2)
     3723        __(bne cr0,match_keys_loop) /* duplicate aok */
     3724        __(beq cr1,match_keys_loop)
     3725        __(ori imm1,imm1,1)
     3726        __(b match_keys_loop)
     3727matched_keys:
     3728        __(clrrwi. imm0,imm1,2)
     3729        __(beqlr)
     3730        __(andi. imm1,imm1,1)
     3731        __(bnelr)
     3732        /* Some unrecognized keywords.  Complain generically about  */
     3733        /* invalid keywords.  */
     3734db_badkeys:
     3735        __(li arg_y,XBADKEYS)
     3736        __(b destructure_error)
     3737toomany:
     3738        __(li arg_y,XCALLTOOMANY)
     3739        __(b destructure_error)
     3740toofew:
     3741        __(li arg_y,XCALLTOOFEW)
     3742        __(b destructure_error)
     3743badlist:
     3744        __(li arg_y,XCALLNOMATCH)
     3745        /* b destructure_error  */
     3746destructure_error:
     3747        __(mr vsp,imm4)         /* undo everything done to the stack  */
     3748        __(mr arg_z,whole_reg)
     3749        __(set_nargs(2))
     3750        __(b _SPksignalerr)
    34673751       
    34683752/* vpush the values in the value set atop the vsp, incrementing nargs.  */
Note: See TracChangeset for help on using the changeset viewer.